基于列值合并SQL Server中连续相同code的行
解决SQL Server中合并连续相同code行的问题
要实现合并连续相同code的行(取组内第一行的FirstDate和最后一行的LastDate),同时保留非连续/不同code的行,可以通过窗口函数分组+聚合的方式实现,具体步骤如下:
完整解决方案SQL
WITH CTE AS ( SELECT *, -- 标记当前行是否为新组的起始:上一行code与当前不同则标记1 CASE WHEN LAG(code) OVER (ORDER BY id) != code THEN 1 ELSE 0 END AS group_flag FROM ABCD ), Grouped AS ( SELECT *, -- 累计标记值,生成每个连续组的唯一ID SUM(group_flag) OVER (ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS group_id FROM CTE ) SELECT ROW_NUMBER() OVER (ORDER BY MIN(id)) AS new_id, MIN(FirstDate) AS FirstDate, MAX(LastDate) AS LastDate, code FROM Grouped GROUP BY group_id, code ORDER BY new_id;
逻辑拆解
识别组的起始位置:
用LAG(code) OVER (ORDER BY id)获取当前行的上一行code,对比后生成group_flag——如果当前行code和上一行不同,说明是新组的开始,标记为1,否则为0。生成连续组ID:
对group_flag做累计求和,这样连续相同code的行会被分配同一个group_id,不同的连续组group_id会依次递增,实现对连续行的分组。分组聚合得到结果:
按group_id和code分组,取每组的最小FirstDate(组内第一行的日期)、最大LastDate(组内最后一行的日期),用ROW_NUMBER()生成新的自增ID,最终得到符合预期的结果。
原SQL问题说明
你之前尝试的自连接逻辑#A.code != #B.code AND #A.id = #B.id存在逻辑错误:
- 相同
id的行(比如原数据中两个id=5的行)code可能相同,无法筛选出需要合并的行; - 自连接无法识别连续行组的逻辑,这类分组问题需要依赖窗口函数来追踪行与行之间的关联关系。
内容的提问来源于stack exchange,提问作者Maria Ruffalo
相关产品推荐
相关产品推荐

