Merge overlapping date intervals

后端 未结 7 975
不知归路
不知归路 2020-11-27 16:16

Is there a better way of merging overlapping date intervals?
The solution I came up with is so simple that now I wonder if someone else has a better idea of how this cou

7条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-11-27 17:02

    You asked this back in 2010 but don't specify any particular version.

    An answer for people on SQL Server 2012+

    WITH T1
         AS (SELECT *,
                    MAX(d2) OVER (ORDER BY d1) AS max_d2_so_far
             FROM   @T),
         T2
         AS (SELECT *,
                    CASE
                      WHEN d1 <= DATEADD(DAY, 1, LAG(max_d2_so_far) OVER (ORDER BY d1))
                        THEN 0
                      ELSE 1
                    END AS range_start
             FROM   T1),
         T3
         AS (SELECT *,
                    SUM(range_start) OVER (ORDER BY d1) AS range_group
             FROM   T2)
    SELECT range_group,
           MIN(d1) AS d1,
           MAX(d2) AS d2
    FROM   T3
    GROUP  BY range_group 
    

    Which returns

    +-------------+------------+------------+
    | range_group |     d1     |     d2     |
    +-------------+------------+------------+
    |           1 | 2010-01-01 | 2010-06-13 |
    |           2 | 2010-06-15 | 2010-08-16 |
    |           3 | 2010-11-01 | 2010-12-31 |
    +-------------+------------+------------+
    

    DATEADD(DAY, 1 is used because your desired results show you want a period ending on 2010-06-25 to be collapsed into one starting 2010-06-26. For other use cases this may need adjusting.

提交回复
热议问题