gpt4 book ai didi

sql - 消除并减少重叠的日期范围

转载 作者:行者123 更新时间:2023-12-02 10:09:43 26 4
gpt4 key购买 nike

我有一组日期范围,其中包含部分和完全重叠的日期,如下所示:

UserID  StartDate   EndDate 
====== ========== ==========
1 2011-01-01 2011-01-02 <- A
1 2011-01-01 2011-01-10 <- A
1 2011-01-08 2011-02-15 <- A
1 2011-02-20 2011-03-10 <- B
2 2011-01-01 2011-01-20 <- C
2 2011-01-15 2011-01-25 <- C

使用 T-SQL,我想为每个用户创建一组新数据,消除重叠数据,扩展范围并在需要时删除冗余数据,结果如下:

UserID  StartDate   EndDate 
====== ========== ==========
1 2011-01-01 2011-02-15 ('A', three rows combined, extending the range)
1 2011-02-20 2011-03-10 ('B', no change, no overlaps here)
2 2011-01-01 2011-01-25 ('C', two rows combined)

如果需要的话,光标很好,但如果我可以不用它们那就更好了。

最佳答案

对于 SQL Server 2005+

-- sample table with data
declare @t table(UserID int, StartDate datetime, EndDate datetime)
insert @t select
1, '20110101', '20110102' union all select
1, '20110101', '20110110' union all select
1, '20110108', '20110215' union all select
1, '20110220', '20110310' union all select
2, '20110101', '20110120' union all select
2, '20110115', '20110125'

-- your query starts below

select UserID, Min(NewStartDate) StartDate, MAX(enddate) EndDate
from
(
select *,
NewStartDate = t.startdate+v.number,
NewStartDateGroup =
dateadd(d,
1- DENSE_RANK() over (partition by UserID order by t.startdate+v.number),
t.startdate+v.number)
from @t t
inner join master..spt_values v
on v.type='P' and v.number <= DATEDIFF(d, startdate, EndDate)
) X
group by UserID, NewStartDateGroup
order by UserID, StartDate

注释:

  1. @t 替换为您的表名称

关于sql - 消除并减少重叠的日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5213484/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com