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

在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`;

逻辑拆解

  1. 生成分组标记:
    用ROW_NUMBER()窗口函数,按每个id分组、date排序,给每行分配一个递增的行号。然后用当前date减去行号对应的天数——连续的日期减去递增的行号,得到的差值是完全相同的,这个差值就是我们区分不同日期区间的分组键group_key。

  2. 聚合起止日期:
    按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 11:18:00