我想根据开始日期和结束日期显示数据。代码可以包含不同的日期。如果任何时间间隔继续,那么我需要合并这些行并显示为单行 这是样本数据
Code Start_Date End_Date Volume
470 24-Oct-10 30-Oct-10 28
470 17-Oct-10 23-Oct-10 2
470 26-Sep-10 2-Oct-10 2
471 22-Aug-10 29-Aug-10 2
471 15-Aug-10 21-Aug-10 2
我想要的输出结果是
Code Start_Date End_Date Volume
470 17-Oct-10 30-Oct-10 30
470 26-Sep-10 2-Oct-10 2
471 15-Aug-10 29-Aug-10 4
代码可以有任何号码。时间的层次。请帮忙。谢谢
答案 0 :(得分:3)
如果我理解你的要求,你会找到类似的东西:
select code, min(Start_date), max(end_date), sum(volume)
from yourtable
group by code
答案 1 :(得分:3)
基于您的示例数据(我将其放在名为Test的表中),并假设没有重叠:
;with Ranges as (
select Code,Start_Date,End_Date,Volume from Test
union all
select r.Code,r.Start_Date,t.End_Date,(r.Volume + t.Volume)
from
Ranges r
inner join
Test t
on
r.Code = t.Code and
DATEDIFF(day,r.End_Date,t.Start_Date) = 1
), ExtendedRanges as (
select Code,MIN(Start_Date) as Start_Date,End_Date,MAX(Volume) as Volume
from Ranges
group by Code,End_Date
)
select Code,Start_Date,MAX(End_Date),MAX(Volume)
from ExtendedRanges
group by Code,Start_Date
说明:
范围CTE包含原始表格中的所有行(因为它们中的一些可能是相关的)以及我们可以通过将范围连接在一起形成的所有行(原始范围和我们构建的任何中间范围 - 我们'在这里做递归)。
然后,对于任何特定的End_Date,ExtendedRanges(命名不佳)会找到可以到达它的最早的Start_Date。
最后,我们查询第二个CTE,为任何特定的Start_Date找到与之关联的最新End_Date。
这两个查询结合起来基本上将Ranges CTE过滤到每组重叠日期范围内的“尽可能最大的Start_Date / End_Date对”。
示例数据设置:
create table Test (
Code int not null,
Start_Date date not null,
End_Date date not null,
Volume int not null
)
insert into Test(Code, Start_Date, End_Date, Volume)
select 470,'24-Oct-10','30-Oct-10',28 union all
select 470,'17-Oct-10','23-Oct-10',2 union all
select 470,'26-Sep-10','2-Oct-10',2 union all
select 471,'22-Aug-10','29-Aug-10',2 union all
select 471,'15-Aug-10','21-Aug-10',2
go