use*_*083 -1 sql t-sql sql-server sql-server-2008
我已经阅读并尝试使用一系列间隙和孤岛检测的标准方法,但没有成功,因为我需要能够忽略任何小于 30 分钟的间隙。由于性能问题,我无法使用游标。
每当有至少 30 分钟的间隙时,我都需要一个包含开始和结束的新行。如果没有至少 30 的间隙,结果将是包含时间戳最小值和最大值的一行。如果有 1 个间隙至少为 30,则将有 2 行 - 从系列的开头到间隙以及从间隙到结束。如果有更多间隙,我们会获取间隙之间每个间隔的行,等等。
输入:
timestamp
2015-07-15 15:01:21
2015-07-15 15:17:44
2015-07-15 15:17:53
2015-07-15 15:18:34
2015-07-15 15:21:41
2015-07-15 15:58:12
2015-07-15 15:59:12
2015-07-15 16:05:12
2015-07-15 17:02:12
Run Code Online (Sandbox Code Playgroud)
期望的输出:
from | to
2015-07-15 15:01:21 | 2015-07-15 15:21:41
2015-07-15 15:58:12 | 2015-07-15 16:05:12
2015-07-15 17:02:12 | 2015-07-15 17:02:12
Run Code Online (Sandbox Code Playgroud)
使用公用表表达式的简单解决方案。如果至少有 1000 行,请与游标性能进行比较。
create table #tmp (Dt datetime)
insert into #tmp values
('2015-07-15 15:01:21'),
('2015-07-15 15:17:44'),
('2015-07-15 15:17:53'),
('2015-07-15 15:18:34'),
('2015-07-15 15:21:41'),
('2015-07-15 15:58:12'),
('2015-07-15 15:59:12'),
('2015-07-15 16:05:12'),
('2015-07-15 17:02:12')
;with tbl as (
select dt, row_number() over(order by dt) rn
from #tmp
)
select t1.dt [from],t2.dt [to], datediff(minute,t1.dt,t2.dt) gap
from tbl t1
inner join tbl t2 on t1.rn+1 = t2.rn
where datediff(minute,t1.dt,t2.dt) >30
Run Code Online (Sandbox Code Playgroud)