我们有一个带有“操作”和时间戳的项目表。我想做的是返回此表中所有项目的列表,其中一行的时间戳在另一行的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看到的东西,但是只会匹配时间戳的第二部分,而忽略了小时和分钟。
答案 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
更快。