SQL:过滤类型 A 事件发生后 1 秒内未发生类型 B 事件的行

标签 sql sql-server t-sql

假设我有一个如下所示的表:

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 的任何记录事件,我们找不到该事件 BC A 1 秒或更短时间内(之前或之后)的事件记录记录一下。

关于SQL:过滤类型 A 事件发生后 1 秒内未发生类型 B 事件的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69656246/

相关文章:

sql - 我什么时候应该嵌套 PL/SQL BEGIN...END block ?

mysql - 使用 Where 子句在 MySql 中创建触发器

python - Azure pyodbc.Error : ('01000' , "[01000][unixODBC][Driver Manager]Can' t 打开 lib 'ODBC Driver 17 for SQL Server':找不到文件 (0) (SQLDriverConnect)

sql-server - 找不到列 ""或用户定义函数或聚合 "",或者名称不明确

sql - T-SQL 使用来自字段表中字符串的整个 WHERE 条件

sql - 在postgresql中插入多列 "with"

sql - 将 varbinary 数据保存到磁盘的脚本

c# - 数据库错误 : There is no row at position 0

.net - 删除 Entity Framework 创建的数据库

sql-server - SQL Server TSQL : Put Subsequent (date) rows into bins