我有一组日期范围,其中包含部分和完全重叠的日期,如下所示:
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
注释:
- 将
@t
替换为您的表名称
关于sql - 消除并减少重叠的日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5213484/