You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于列值合并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;

逻辑拆解

  1. 识别组的起始位置:
    用LAG(code) OVER (ORDER BY id)获取当前行的上一行code,对比后生成group_flag——如果当前行code和上一行不同,说明是新组的开始,标记为1,否则为0。

  2. 生成连续组ID:
    对group_flag做累计求和,这样连续相同code的行会被分配同一个group_id,不同的连续组group_id会依次递增,实现对连续行的分组。

  3. 分组聚合得到结果:
    按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 20:05:13