我在使用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
答案 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 <>小提琴。