Eu tenho uma série de linhas representando start ( S
) ou e ( E
) é umthing
+----+-------+-------+
| Id | Event | Thing |
+----+-------+-------+
| 1 | S | A |
| 2 | E | A |
| 3 | S | B |
| 4 | E | B |
| 5 | S | C |
| 6 | S | D |
| 7 | S | E |
+----+-------+-------+
Estou tentando obter as linhas que não têm evento final.
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'
Isso retorna
+------+---------+------+---------+
| ID a | Event a | ID b | Event b |
+------+---------+------+---------+
| 1 | S | 2 | E |
| 3 | S | 4 | E |
+------+---------+------+---------+
É aqui que estou ficando preso.
Eu quero todos os IDs que não estão na ID a
coluna nem na ID b
coluna. Então eu estou supondo LEFT JOIN
encontrar todas as linhas que não têm evento final.
NB: A tabela real é um log SSIS com muitos milhões de linhas.
Aqui estão algumas maneiras.
NOT EXISTS
para uma anti semijunçãoS
em vezE
desta Coisa não tem evento final.LAG
para examinar a linha anterior à linha atual ao ordenar por evento em ordem alfabética. Se a linha atual forS
e não houver nenhuma linha anteriorEvt
seráNULL
. Apenas preserve tais linhas. Esta é a sintaxe de 2012+.