按每个ID的最小和最大日期分组

时间:2020-03-27 13:33:23

标签: sql sql-server database tsql

我在使用SQL时遇到了困难。希望每个人都能对此有所帮助。谢谢!

我有以下数据集:

Mike 1/1/2019  4/30/2019  
Mike 5/1/2019  7/31/2019  
Mike 11/1/2019 12/31/2019  
Jen  3/1/2019  5/31/2019  
Jen  6/1/2019  7/31/2019  

如何编写SQL脚本,以便获得以下结果?

Mike 1/1/2019 7/31/2019  
Mike 11/1/2019 12/31/2019  
Jen 3/1/2019 7/31/2019  

我尝试编写以下SQL脚本,但没有满足我的要求。

Select Name, min(startdate) as start, max(enddate) as end
from testtable
group by Name

我得到以下信息:

Mike 1/1/2019 12/31/2019  
Jen 3/1/2019  7/31/2019

1 个答案:

答案 0 :(得分:1)

这是一种间隙和孤岛问题。我想通过获取每个记录的累积最大终止日期来解决此问题。当此结束日期与当前开始日期之间有间隔时,将开始一个新的“岛屿”:

select name, grp, min(startdate), max(enddate)
from (select t.*,
             sum(case when prev_enddate >= dateadd(day, -1, startdate) then 0 else 1 end) over
                 (partition by name order by startdate) as grp
      from (select t.*,
                   max(enddate) over (partition by name
                                      order by startdate
                                      rows between unbounded preceding and 1 preceding
                                     ) as prev_enddate
            from t
           ) t
     ) t
group by name, grp;

Here是db <>小提琴。