2017-03-09 67 views
2

我有一个很奇怪的请求。我试图创建一个SQL语句来做到这一点。我知道我可以创建一个游标,但试图查看它是否可以完成。SQL基于时差的记录

这是我的源数据。

1 - 1:00 PM 
2 - 1:02 PM 
3 - 1:03 PM 
4 - 1:05 PM 
5 - 1:06 PM 
6 - 1:09 PM 
7 - 1:10 PM 
8 - 1:12 PM 
9 - 1:13 PM 
10 - 1:15 PM 

我想创建一个函数,如果我传递一个时间间隔,它将返回结果数据集。

比如我通过在5分钟后,我希望后面的记录是记录1,4,7,10 &

有没有办法在SQL做到这一点。注意:如果记录4(1:05 PM不在数据集中,我期望看到1,5,& 8.我会看到5,因为它是来自记录1的时间大于5分钟的下一个记录,并且记录8,因为它是下一个记录与时间从记录大于5分钟5

+1

这很棘手......期待看到的答案。 (只要它没有循环或光标) – SqlZim

+2

这有什么用途?这听起来像一个[X Y问题](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)或Py/JS的工作 – scsimon

回答

3

这里要说的是,你应该提供一个创建脚本:

declare @Table1 TABLE 
    ([id] int, [time] time) 
; 

INSERT INTO @Table1 
    ([id], [time]) 
VALUES 
    (1, '1:00 PM'), 
    (2, '1:02 PM'), 
    (3, '1:03 PM'), 
    (4, '1:05 PM'), 
    (5, '1:06 PM'), 
    (6, '1:09 PM'), 
    (7, '1:10 PM'), 
    (8, '1:12 PM'), 
    (9, '1:13 PM'), 
    (10, '1:15 PM') 
; 

我将与此查询做到这一点:

declare @interval int 
set @interval = 5 

;with next_times as(
select id, [time], (select min([time]) from @Table1 t2 where t2.[time] >= dateadd(minute, @interval, t1.[time])) as next_time 
from @Table1 t1 
), 
t as(
select id, [time], next_time 
from next_times t1 where id=1 
union all 
select t3.id, t3.[time], t3.next_time 
from t inner join next_times t3 
on t.next_time = t3.[time] 
) 
select id, [time] from t order by 1 

-- results: 
id   time 
----------- ---------------- 
1   13:00:00.0000000 
4   13:05:00.0000000 
7   13:10:00.0000000 
10   13:15:00.0000000 

(4 row(s) affected) 

即使在间隔缺失的情况下也能正常工作:

-- delete the 1:05 PM record 
delete from @table1 where id = 4; 

;with next_times as(
select id, [time], (select min([time]) from @Table1 t2 where t2.[time] >= dateadd(minute, @interval, t1.[time])) as next_time 
from @Table1 t1 
), 
t as(
select id, [time], next_time 
from next_times t1 where id=1 
union all 
select t3.id, t3.[time], t3.next_time 
from t inner join next_times t3 
on t.next_time = t3.[time] 
) 
select id, [time] from t order by 1; 

-- results: 
id   time 
----------- ---------------- 
1   13:00:00.0000000 
5   13:06:00.0000000 
8   13:12:00.0000000 

(3 row(s) affected)