如何解决通过将延迟放在SQL Server中来输出数据
我在SQL Server中有一个如下表,如下所示。
SELECT * FROM OverlappingDateRanges
Id startDate EndDate
10001 2020-04-01 00:00:00.000 2020-05-25 00:00:00.000
10001 2020-05-26 00:00:00.000 2020-07-15 00:00:00.000
10001 2020-07-17 00:00:00.000 2020-08-15 00:00:00.000
10001 2020-08-16 00:00:00.000 2020-10-15 00:00:00.000
10001 2020-10-16 00:00:00.000 2020-12-31 00:00:00.000
10002 2020-05-01 00:00:00.000 2020-05-29 00:00:00.000
10002 2020-05-30 00:00:00.000 2020-07-08 00:00:00.000
10002 2020-07-09 00:00:00.000 2020-10-01 00:00:00.000
10002 2020-10-03 00:00:00.000 2020-12-31 00:00:00.000
我想要如下所示的输出,如果结束日期与具有相同ID的下一个开始日期之间没有日期差,则日期将继续,并且如果结束日期和下一个开始日期不在继续中,则日期应该中断。
输出应为:
id startDate endDate
10001 2020-04-01 00:00:00.000 2020-07-15 00:00:00.000
10001 2020-07-17 00:00:00.000 2020-12-31 00:00:00.000
10002 2020-05-01 00:00:00.000 2020-10-01 00:00:00.000
10002 2020-10-03 00:00:00.000 2020-12-31 00:00:00.000
解决方法
这是一种空白和岛屿问题。通过查看前一行结束,确定每个输出行从何处开始。然后做一个累加的总和:
select id,min(startdate),max(enddate)
from (select t.*,sum(case when prev_enddate >= dateadd(day,-1,startdate) then 0 else 1
end) over (partition by id order by startdate) as grp
from (select t.*,lag(enddate) over (partition by id order by startdate) as prev_enddate
from t
) t
) t
group by id,grp;
Here是db 小提琴。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。