在SQL Server中按ID分组连续日期并识别日期间隔
解决连续日期分组问题
这是个经典的连续日期区间分组需求,用SQL窗口函数就能完美实现。先直接上可运行的SQL代码,再给你拆解逻辑:
实现代码
-- 先给每个id的日期生成分组标记,再聚合得到起止日期 WITH ranked_dates AS ( SELECT id, date, -- 核心逻辑:连续日期减去递增行号后,差值会一致,以此作为分组依据 DATE_SUB(date, INTERVAL ROW_NUMBER() OVER (PARTITION BY id ORDER BY date) DAY) AS group_key FROM your_table_name -- 替换成你的实际表名 ) SELECT id, MIN(date) AS `from`, MAX(date) AS `to` FROM ranked_dates GROUP BY id, group_key ORDER BY id, `from`;
逻辑拆解
生成分组标记:
用ROW_NUMBER()窗口函数,按每个id分组、date排序,给每行分配一个递增的行号。然后用当前date减去行号对应的天数——连续的日期减去递增的行号,得到的差值是完全相同的,这个差值就是我们区分不同日期区间的分组键group_key。聚合起止日期:
按id和group_key分组,取每组的最小日期作为区间起始(from),最大日期作为区间结束(to),最后按id和起始日期排序,就得到了你想要的结果。
匹配你的测试数据
拿你提供的例子验证:
- 对于
id=1:- 2019-01-01(行号1)→ 2019-01-01 -1天 = 2018-12-31
- 2019-01-02(行号2)→ 2019-01-02 -2天 = 2018-12-31 → 这两个属于同一组
- 2019-01-04(行号3)→ 2019-01-04 -3天 = 2019-01-01
- 2019-01-05(行号4)→ 2019-01-05 -4天 = 2019-01-01 → 这两个属于另一组
- 对于
id=2同理,连续的3天会被分到同一组,后续的两天也会形成一个独立组,完全符合你预期的输出格式。
内容的提问来源于stack exchange,提问作者user2957125
相关产品推荐
相关产品推荐

