SQL Server合并连续匹配的多行数据为单行的实现方案咨询
SQL Server 连续行合并(孤岛问题)实现方案
你之前用到的双ROW_NUMBER()差值计算分组标识的思路是正确的,失败大概率是遗漏了后续聚合的分组条件配置,完整实现逻辑如下:
完整SQL代码
WITH group_mark AS ( SELECT *, -- 计算相同属性组的连续标识 ROW_NUMBER() OVER(ORDER BY id) - ROW_NUMBER() OVER(PARTITION BY groupId, name, email, phone ORDER BY id) AS seq FROM 你的表名 ) SELECT groupId, name, email, phone, MIN(start_time) AS start_time, MAX(end_time) AS end_time FROM group_mark -- 注意:必须把属性字段和seq共同作为分组键 GROUP BY groupId, name, email, phone, seq -- 保持输出顺序和原数据行顺序一致 ORDER BY MIN(id)
逻辑说明
- 连续行的判定依据为
id升序:同属性的行只要在id排序下是连续的序列,两个ROW_NUMBER()的差值就是固定值,也就是我们用来分组的seq - 当任意一个分组属性(groupId/name/email/phone)发生变化时,
PARTITION BY后的ROW_NUMBER()会重置计数,seq值就会发生变化,以此区分不同的连续分组 - 如果你的连续判定依据是
start_time而非id,只需要把两处ORDER BY id统一替换为ORDER BY start_time即可
内容的提问来源于stack exchange,提问作者vizon
相关产品推荐
相关产品推荐

