sql - 如何根据 DateTime 和其他变量计算 SQL?
问题描述
我有一个测试结果失败的 SQL 表:
Run Test DateTime
1 20 2020-01-01 00:01
1 20 2020-01-01 00:00
1 20 2020-01-01 00:04
2 21 2020-01-01 00:10
2 21 2020-01-01 00:03
这张表告诉我测试失败了,但我想知道它是第一次、第二次还是第三次测试。最后,我想用一个标志来做,其中 ax 代表失败的测试,X 代表相关的测试,就像这样:
Run Test StartTime Status
1 20 2020-01-01 00:01 xXx
1 20 2020-01-01 00:00 Xxx
1 20 2020-01-01 00:04 xxX
2 21 2020-01-01 00:10 xX
2 21 2020-01-01 00:03 Xx
它必须与 COUNT 和 SUM 做一些事情,但我找不到从这个案例开始的地方。你能帮助我吗?
解决方案
基本上,你想要row_number()
一个窗口count()
:
select t.*,
row_number() over(partition by run, test order by datetime) rn,
count(*) over(partition by run, test) cnt
from mytable t
从那里开始,您可以使用字符串函数生成“状态”:
select t.*,
replicate('x', rn - 1) + 'X' + replicate('x', cnt - rn) status
from (
select t.*,
row_number() over(partition by run, test order by datetime) rn,
count(*) over(partition by run, test) cnt
from mytable t
) t
运行 | 测试 | 日期时间 | rn | cnt | 地位 --: | ---: | :--------------- | -: | --: | :----- 1 | 20 | 2020-01-01 00:00 | 1 | 3 | xxx 1 | 20 | 2020-01-01 00:01 | 2 | 3 | xXx 1 | 20 | 2020-01-01 00:04 | 3 | 3 | xxx 2 | 21 | 2020-01-01 00:03 | 1 | 2 | XX 2 | 21 | 2020-01-01 00:10 | 2 | 2 | xX
推荐阅读
- javascript - 动态添加到 Promise 数组时,Promise 全部提前完成
- java - 根据杰克逊中的xml文档属性在反序列化期间检测对象类型 - 没有JsonNode
- node.js - 为什么我在 Mongoose 中的 createIndex 失败了?
- c - 为什么“__tracepoint_sched_switch”未定义
- jwt - 如何使用 Google IAP 对 JupyterHub 进行身份验证?
- python - 如何在熊猫数据框中逐行迭代并在其列中查找值
- scala - 如何将 RowMatrix 转换为本地矩阵?
- c - 在什么情况下我们应该使用指向指针的指针?
- java - 合并两个数组,例如,两个数组的元素相互交替定位
- vue.js - 具有多个对象值的 Element-UI el-select 不显示标签