日期:2014-05-17  浏览次数:20431 次

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情况的时间连续的多条合并一条,时间首尾相接

谢谢,目前我能想到的是拆分成单挑在合并,不知各位有什么简单方法没。
------解决方案--------------------
--> 测试数据:[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]