SQL Server 如何筛选连续相同值分组的最早日期记录?
SQL连续值变更历史查询实现方案
核心逻辑
要实现连续相同Value仅保留最早日期记录的需求,采用连续岛屿标记法处理,步骤如下:
- 按ID分组、Date升序排序,通过
LAG窗口函数获取当前记录的前一条Value值 - 对每条记录标记是否发生Value变更(第一条记录默认算变更)
- 对变更标记做累加求和,相同连续Value的记录会得到相同的分组ID
- 每个分组取最小Date的记录即为最终结果
通用实现代码
WITH value_change_flag AS ( SELECT ID, Value, Date, -- 标记当前值与上一条是否不同,不同则记为1 CASE WHEN LAG(Value) OVER (PARTITION BY ID ORDER BY Date) = Value THEN 0 ELSE 1 END AS is_changed FROM 你的业务表名 ), continuous_group AS ( SELECT ID, Value, Date, -- 累加变更标记,生成连续相同值的分组ID SUM(is_changed) OVER (PARTITION BY ID ORDER BY Date) AS group_id FROM value_change_flag ) -- 每个连续值分组仅保留最早日期的记录 SELECT ID, Value, MIN(Date) AS Date FROM continuous_group GROUP BY ID, Value, group_id ORDER BY ID, Date;
使用说明
将代码中的你的业务表名替换为实际业务表名称即可,执行后输出结果与需求预期完全匹配,支持MySQL8.0+、PostgreSQL、SQL Server、Hive等所有支持标准窗口函数的数据库。
内容的提问来源于stack exchange,提问作者ravrsg
相关产品推荐
相关产品推荐

