【发布时间】:2015-09-01 19:02:38
【问题描述】:
我有一个包含开始和结束日期列(事件不重叠)的事件表,示例数据
if object_id('tempdb..#SourceTable') is not null
begin
drop table #SourceTable
end
create table #SourceTable
(
Id int identity(1,1) not null,
WindowRange varchar(15) not null,
StartDatetime datetime null,
EndDatetime datetime null
)
insert into #SourceTable
(
WindowRange,
StartDatetime,
EndDatetime
)
values
('04:20 - 05:36', '2015-08-31 04:20:01.890', '2015-08-31 05:36:14.290' ),
('00:20 - 01:24', '2015-08-31 00:20:01.487', '2015-08-31 01:24:52.983' ),
('20:20 - 21:27', '2015-08-30 20:20:01.177', '2015-08-30 21:27:53.317' ),
('16:20 - 17:28', '2015-08-30 16:20:01.133', '2015-08-30 17:28:24.173' ),
('12:20 - 13:30', '2015-08-30 12:20:01.273', '2015-08-30 13:30:38.370' )
样本输出
Id WindowRange StartDatetime EndDatetime
1 04:20 - 05:36 2015-08-31 04:20:01.890 2015-08-31 05:36:14.290
2 00:20 - 01:24 2015-08-31 00:20:01.487 2015-08-31 01:24:52.983
3 20:20 - 21:27 2015-08-30 20:20:01.177 2015-08-30 21:27:53.317
4 16:20 - 17:28 2015-08-30 16:20:01.133 2015-08-30 17:28:24.173
5 12:20 - 13:30 2015-08-30 12:20:01.273 2015-08-30 13:30:38.370
我想要额外的行来填补范围中的空白,例如上面的例子
预期输出
Id WindowRange StartDatetime EndDatetime
1 04:20 - 05:36 2015-08-31 04:20:01.890 2015-08-31 05:36:14.290
2 01:24 - 04:20 2015-08-31 01:24:52.983 2015-08-31 04:20:01.890
3 00:20 - 01:24 2015-08-31 00:20:01.487 2015-08-31 01:24:52.983
4 00:00 - 00:20 2015-08-31 00:00:00.000 2015-08-31 00:20:01.487
5 21:27 - 23:59 2015-08-30 21:27:53.317 2015-08-30 23:59:59.999
6 20:20 - 21:27 2015-08-30 20:20:01.177 2015-08-30 21:27:53.317
7 17:28 - 20:20 2015-08-30 17:28:24.173 2015-08-30 20:20:01.177
8 16:20 - 17:28 2015-08-30 16:20:01.133 2015-08-30 17:28:24.173
9 13:30 - 16:20 2015-08-30 13:30:38.370 2015-08-30 16:20:01.133
10 12:20 - 13:30 2015-08-30 12:20:01.273 2015-08-30 13:30:38.370
我尝试过使用带有窗口函数的公用表表达式,但似乎无法正确处理
;with myCTE as
(
select
row_number() over (order by EndDatetime desc) as SeqNo,
StartDatetime,
EndDatetime
from #SourceTable
)
select
t1.SeqNo as [T1SeqNo],
t2.SeqNo as [T2SeqNo],
t1.StartDatetime as [T1Start],
t1.EndDatetime as [T1End],
t2.StartDatetime as [T2Start],
t2.EndDatetime as [T2End]
from myCTE t1
left join myCTE t2
on t1.SeqNo = t2.SeqNo - 1
任何建议/帮助将不胜感激。
【问题讨论】:
标签: sql sql-server sql-server-2008 gaps-and-islands