在 SQL 服务器中制作日期组

Making groups of dates in SQL Server

我有一个 table 包含 ID 和日期,我想为每个 ID 分组日期

 id      date 
 ------------------
  1      2019-01-01
  2      2019-01-01
  1      2019-01-02
  2      2019-01-02
  2      2019-01-03
  1      2019-01-04
  1      2019-01-05
  2      2019-01-05
  2      2019-01-06

我想检查每个 ID 的日期差距在哪里,以获得类似

的输出
id      from             to
------------------------------------
 1      2019-01-01       2019-01-02
 1      2019-01-04       2019-01-05
 2      2019-01-01       2019-01-03
 2      2019-01-05       2019-01-06

这是一种缺口孤岛问题。最简单的解决方案是为每个 id 生成一个序列号,然后从日期中减去它。对于连续的日期,这是常量。

所以:

select id, min(date), max(date)
from (select t.*, row_number() over (partition by id order by date) as seqnum
      from t
     ) t
group by id, dateadd(day, -seqnum, date)
order by id, min(date);

Here 是一个 db<>fiddle.

解决此间隙和孤岛问题的典型方法是通过将当前记录的 date 与相同 [=13] 的 "previous" date 进行比较来构建组=].当日期不连续时,新组开始:

select id, min(date) from_date, max(date) to_date
from (
    select 
        t.*, 
        sum(case when date = dateadd(day, 1, lag_date) then 0 else 1 end) 
            over(partition by id order by date) grp
    from (
        select 
            t.*, 
            lag(date) over(partition by id order by date) lag_date
        from mytable t
    ) t
) t
group by id, grp
order by id, from_date