SQl 时间段合并有关问题
SQl 时间段合并问题
有如下输入
A B 2012-1-1 2012-1-5
A B 2012-1-6 2012-1-9
A B 2012-1-10 2012-1-12
A C 2012-2-1 2012-2-8
A D 2012-3-1 2012-3-5
A D 2012-3-7 2012-3-9
变为
A B 2012-1-1 2012-1-12
A C 2012-2-1 2012-2-8
A D 2012-3-1 2012-3-5
A D 2012-3-7 2012-3-9
A 在B情况的时间连续的多条合并一条,时间首尾相接
谢谢,目前我能想到的是拆分成单挑在合并,不知各位有什么简单方法没。
------解决方案--------------------
有如下输入
A B 2012-1-1 2012-1-5
A B 2012-1-6 2012-1-9
A B 2012-1-10 2012-1-12
A C 2012-2-1 2012-2-8
A D 2012-3-1 2012-3-5
A D 2012-3-7 2012-3-9
变为
A B 2012-1-1 2012-1-12
A C 2012-2-1 2012-2-8
A D 2012-3-1 2012-3-5
A D 2012-3-7 2012-3-9
A 在B情况的时间连续的多条合并一条,时间首尾相接
谢谢,目前我能想到的是拆分成单挑在合并,不知各位有什么简单方法没。
------解决方案--------------------
--> 测试数据:[TB]
if object_id('[TB]') is not null drop table [TB]
GO
create table [TB]([ca] varchar(1),[cb] varchar(1),[cc] datetime,[cd] datetime)
insert [TB]
select 'A','B','2012-1-1','2012-1-5' union all
select 'A','B','2012-1-6','2012-1-9' union all
select 'A','B','2012-1-10','2012-1-12' union all
select 'A','C','2012-2-1','2012-2-8' union all
select 'A','D','2012-3-1','2012-3-5' union all
select 'A','D','2012-3-7','2012-3-9'
WITH temp AS(
SELECT * FROM TB t
CROSS APPLY
(SELECT flag=DATEADD(dd,number,t.cc)
FROM [master].dbo.spt_values sv WHERE sv.[type]='p' AND DATEADD(dd,number,t.cc)<=cd)g
)
SELECT ca,cb,MIN(cc)AS cc,MAX(cd) AS cd FROM (
SELECT *,number=ROW_NUMBER() OVER (PARTITION BY cb ORDER BY cc) FROM temp t)g
GROUP BY ca,cb,number-DATEPART(dd,flag)
ORDER BY cb
/*
ca cb cc cd
---- ---- ----------------------- -----------------------
A B 2012-01-01 00:00:00.000 2012-01-12 00:00:00.000
A C 2012-02-01 00:00:00.000 2012-02-08 00:00:00.000
A D 2012-03-01 00:00:00.000 2012-03-05 00:00:00.000
A D 2012-03-07 00:00:00.000 2012-03-09 00:00:00.000
(4 行受影响)
*/
drop table [TB]