这是我的示例数据集:
身份证 | 时间戳 | 持续时间 | 状态 |
---|---|---|---|
17 | 2024年11月5日 00:00 | 0 | 自动 |
16 | 2024年11月4日23:59 | 0 | 自动 |
15 | 2024年11月4日23:58 | 1,47 | 自动 |
14 | 2024年11月4日23:52 | 5,72 | 手册 |
13 | 2024年11月4日23:52 | 0,13 | 高效 |
12 | 2024年11月4日23:52 | 0,5 | 错误 |
11 | 2024年11月4日23:50 | 1,83 | 自动 |
10 | 2024年11月4日23:50 | 0,08 | 高效 |
9 | 2024年11月4日23:48 | 1,67 | 自动 |
8 | 2024年11月4日23:48 | 0,12 | 高效 |
7 | 2024年11月4日23:46 | 1,57 | 自动 |
6 | 2024年11月4日23:46 | 0,17 | 高效 |
5 | 2024年11月4日23:44 | 2,08 | 自动 |
4 | 2024年11月4日23:44 | 0,1 | 高效 |
3 | 2024年11月4日23:42 | 1,67 | 自动 |
2 | 2024年11月4日23:42 | 0,13 | 高效 |
1 | 2024年11月4日23:40 | 1,83 | 自动 |
我的目标表应该是这个:
身份证 | 时间戳 | 持续时间 | 状态 |
---|---|---|---|
9 | 2024年11月5日 00:00 | 0 | 自动 |
8 | 2024年11月4日23:59 | 0 | 自动 |
7 | 2024年11月4日23:58 | 1,47 | 自动 |
6 | 2024年11月4日23:52 | 5,72 | 手册 |
5 | 2024年11月4日23:52 | 0,13 | 高效 |
4 | 2024年11月4日23:52 | 0,5 | 错误 |
3 | 2024年11月4日23:50 | 1,83 | 自动 |
2 | 2024年11月4日23:42 | 7,59 | 高效 |
1 | 2024年11月4日23:40 | 1,83 | 自动 |
我希望在状态“高效”和“自动 - 高效”交替出现时立即合并所有行。在此过程中累计持续时间。我如何通过 SQL 查询来实现这一点?我已经思考这个问题好几天了,不幸的是我找不到正确的解决方案。我已经尝试使用 CTE 来创建和分组特定序列。不幸的是到目前为止还没有成功。
如果您从相反方向(ID 升序)查看序列,则主要技巧似乎是识别重复交替序列
Auto
- Productive
的结束位置。
这可以通过计算包含
'Auto'
的奇数行和包含 'Productive'
的偶数行来完成。该序列在 MAX(ID)
处结束,其中 State = 'Productive'
和两个计数都等于总运行行数的一半。
一旦掌握了这些,您就可以将数据分为两部分,对第一部分执行分组和聚合,并对未修改的第二部分执行分组和聚合。
最后一步是使用UNION ALL
定义新的
ID
值。ROW_NUMBER()
结果:
时间戳 | 持续时间 | 状态 | |
---|---|---|---|
2024-11-05 00:00 | 0.00 | 自动 | |
2024-11-04 23:59 | 0.00 | 自动 | |
2024-11-04 23:58 | 1.47 | 自动 | |
2024-11-04 23:52 | 5.72 | 手册 | |
2024-11-04 23:52 | 0.13 | 高效 | |
2024-11-04 23:52 | 0.50 | 错误 | |
2024-11-04 23:50 | 1.83 | 自动 | |
2024-11-04 23:42 | 0.60 | 高效 | |
2024-11-04 23:40 | 8.82 | 自动 |