假设我有一个如下所示的表:
timestamp event
2021-06-01 12:00:00.000 A
2021-06-01 12:00:00.200 B
2021-06-01 12:00:00.500 C
2021-06-01 12:00:01.700 A
2021-06-01 12:00:02.000 D
2021-06-01 12:00:03.000 B
我想选择事件 A 的 1 秒内事件 B 和 C 未发生的所有事件 A 的时间戳。
因此,从上面的示例中,将返回时间戳 2021-06-01 12:00:01.700。
最好是在 SQL Server 中,但任何 SQL 语法都可以帮助我弄清楚如何编写此类查询。
最佳答案
我们可以在这里使用存在逻辑:
SELECT timestamp, event
FROM yourTable t1
WHERE event = 'A' AND
NOT EXISTS (
SELECT 1
FROM yourTable t2
WHERE ABS(DATEDIFF(ms, t2.timestamp, t1.timestamp)) <= 1000 AND
t2.event IN ('B', 'C')
);
Demo
用简单的英语阅读,上面的查询表示返回 A
的任何记录事件,我们找不到该事件 B
或C
A
1 秒或更短时间内(之前或之后)的事件记录记录一下。
关于SQL:过滤类型 A 事件发生后 1 秒内未发生类型 B 事件的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69656246/