如何在彼此之间30秒内找到带有时间戳的行

时间:2019-03-26 15:39:52

标签: sql sql-server-2012

我们有一个带有“操作”和时间戳的项目表。我想做的是返回此表中所有项目的列表,其中一行的时间戳在另一行的30秒内,并且具有“已批准”操作,并且具有相同的项代码。

项目表

ID    Title      Code  
---   ---------- ---------
1     Title 1    B35
2     Title 2    A35
3     Title 3    A35
4     Title 4    A35
5     Title 5    A35
6     Title 6    A35
7     Title 7    B17

操作表

ID    Action     Timestamp                    ItemId   
---   ---------- -------------------------    --------
1     Submitted   2018-02-27 16:29:52.307     1
2     Approved    2018-02-28 11:06:56.773     2
3     Approved    2018-02-28 11:07:10.773     3
4     Approved    2018-02-28 12:45:09.773     4
5     Approved    2018-03-15 13:36:03.003     5
6     Approved    2018-03-15 13:36:27.003     6
7     Approved    2018-03-15 13:36:28.003     7

因此,举例来说,鉴于上面的表格,它会告诉我第2行和第3行以及第5行和第6行,因此第7行将不匹配,因为Item表上的项目代码不匹配)。我已经尝试了一些我从stackoverflow看到的东西,但是只会匹配时间戳的第二部分,而忽略了小时和分钟。

1 个答案:

答案 0 :(得分:1)

您可以使用exists,但我建议使用lag() / lead()

select t.*
from (select t.*,
             lag(timestamp) over (order by timestamp) as prev_timestamp,
             lead(timestamp) over (order by timestamp) as next_timestamp
      from t
     ) t
where timestamp < dateadd(second, 30, prev_timestamp) or
      timestamp > dateadd(second, 30, next_timestamp);

在更大的数据上,我希望它比exists更快。