在 SQL (Azure SQL) 中按特定顺序合并行

问题描述 投票:0回答:1

这是我的示例数据集:

身份证 时间戳 持续时间 状态
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 来创建和分组特定序列。不幸的是到目前为止还没有成功。

sql sql-server azure-sql-database
1个回答
0
投票

如果您从相反方向(ID 升序)查看序列,则主要技巧似乎是识别重复交替序列

Auto
-
Productive
的结束位置。

这可以通过计算包含

'Auto'
的奇数行和包含
'Productive'
的偶数行来完成。该序列在
MAX(ID)
处结束,其中
State = 'Productive'
和两个计数都等于总运行行数的一半。

一旦掌握了这些,您就可以将数据分为两部分,对第一部分执行分组和聚合,并对未修改的第二部分执行分组和聚合。

最后一步是使用 

UNION ALL

定义新的

ID
值。
ROW_NUMBER()

结果:

身份证987654321
时间戳 持续时间 状态
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 自动
请参阅
this db<>fiddle

进行演示。

© www.soinside.com 2019 - 2024. All rights reserved.