我有一系列行代表开始 ( S
) 或 ( E
) 是一个thing
+----+-------+-------+
| Id | Event | Thing |
+----+-------+-------+
| 1 | S | A |
| 2 | E | A |
| 3 | S | B |
| 4 | E | B |
| 5 | S | C |
| 6 | S | D |
| 7 | S | E |
+----+-------+-------+
我正在尝试获取没有结束事件的行。
SELECT [a].[Id] AS [ID a],
[a].[Event] AS [Event a],
[b].[Id] AS [ID b],
[b].[Event] AS [Event b]
FROM [dbo].[TimeSeries] AS [a]
LEFT OUTER JOIN [dbo].[TimeSeries] AS [b]
ON [b].[Thing] = [a].[Thing]
WHERE [a].[Event] = 'S'
AND [b].[Event] = 'E'
这返回
+------+---------+------+---------+
| ID a | Event a | ID b | Event b |
+------+---------+------+---------+
| 1 | S | 2 | E |
| 3 | S | 4 | E |
+------+---------+------+---------+
这就是我被困的地方。
我想要所有既不在ID a
列中也不在ID b
列中的 ID。然后我猜想LEFT JOIN
找到所有没有结束事件的行。
注意:真实的表是一个包含数百万行的 SSIS 日志。
这里有几种方法。
NOT EXISTS
反半连接S
而不是E
这个Thing则没有结束事件。LAG
在按事件字母顺序排序时查看当前行的前一行。如果当前行是S
并且没有前一行Evt
将是NULL
。只需保留任何此类行。这是 2012+ 语法。