SQL Server 2008查询重复名称最新连续出现的最早日期
SQL Server 2008环境下获取指定名称最新连续序列最早日期的解决方案
核心思路
采用经典的「日期孤岛分组」逻辑实现,完全兼容SQL Server 2008,无需使用LEAD/LAG函数:
- 连续日期的记录按升序排序后,「日期减去对应行号的天数」得到的基准值完全相同,以此作为分组标识将连续出现的记录归为同一组
- 筛选出结束日期最大的分组(即最新的连续序列),取该组内的最小日期即可得到结果
完整查询代码
SELECT MIN(Date) AS 最新连续序列最早日期 FROM ( SELECT Date, -- 生成连续序列分组标识 DATEADD(DAY, -ROW_NUMBER() OVER (ORDER BY Date ASC), Date) AS GroupID FROM myTable WHERE Name = 'X' ) AS GroupedRecords -- 匹配最新连续序列的分组标识 WHERE GroupID = ( SELECT TOP 1 GroupID FROM ( SELECT DATEADD(DAY, -ROW_NUMBER() OVER (ORDER BY Date ASC), Date) AS GroupID FROM myTable WHERE Name = 'X' ) AS AllGroups GROUP BY GroupID -- 按分组的最大日期倒序,取第一个就是最新的连续序列 ORDER BY MAX(Date) DESC )
逻辑验证(以你给出的示例数据为例)
示例中X的四条记录按日期排序后计算分组标识:
- 行号1对应2021-01-22,分组标识为2021-01-21
- 行号2对应2021-01-28,分组标识为2021-01-26
- 行号3对应2021-01-29,分组标识为2021-01-26
- 行号4对应2021-01-30,分组标识为2021-01-26
分组后最大结束日期对应的分组标识为2021-01-26,取该组最小日期得到2021-01-28,完全符合需求。
内容的提问来源于stack exchange,提问作者good samaritan
相关产品推荐
相关产品推荐

