【问题标题】:Making groups of dates in SQL Server在 SQL Server 中创建日期组
【发布时间】:2020-08-01 21:30:04
【问题描述】:

我有一个包含 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

【问题讨论】:

    标签: sql sql-server tsql date gaps-and-islands


    【解决方案1】:

    这是一种差距和孤岛问题。最简单的解决方案是为每个 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 是一个 dbfiddle。

    【讨论】:

      【解决方案2】:

      解决此差距和孤岛问题的典型方法是通过将当前记录的 date 与同一 id 的“先前”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
      

      【讨论】:

        猜你喜欢
        • 2013-10-31
        • 1970-01-01
        • 1970-01-01
        • 2015-11-26
        • 1970-01-01
        • 1970-01-01
        • 2020-10-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多