gpt4 book ai didi

sql-server - 在 SQL Server 中根据日期合并行

转载 作者:行者123 更新时间:2023-12-02 23:28:15 26 4
gpt4 key购买 nike

我想根据开始日期和结束日期显示数据。一个代码可以包含不同的日期。如果任何时间间隔继续,那么我需要合并这些行并显示为单行这是示例数据

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

代码可以有任何编号。的时间间隔。请帮忙。谢谢

最佳答案

基于您的示例数据(我已将其放入名为“测试”的表中),并假设没有重叠:

;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,ExtendRanges(命名很糟糕)会查找可以到达它的最早的 Start_Date。

最后,我们查询第二个 CTE,以查找任何特定 Start_Date 与其关联的最新 End_Date。

这两个查询结合起来基本上可以将范围 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

关于sql-server - 在 SQL Server 中根据日期合并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4345910/

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