检测时间戳列中超过 30 分钟的间隙

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)

Ale*_*hev 5

使用公用表表达式的简单解决方案。如果至少有 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)