Estou trabalhando com um conjunto de dados de eventos como o do exemplo abaixo:
Event_Type Event_Timestamp Is_Active
A 2010-10-01 00:00:00 1
B 2010-10-01 00:00:01 1
A 2010-10-01 00:00:02 0
D 2010-10-01 00:00:03 1
B 2010-10-01 00:00:04 0
C 2010-10-01 00:00:05 1
A 2010-10-01 00:00:06 1
A 2010-10-01 00:00:07 1
A 2010-10-01 00:00:08 0
O conjunto de dados é ordenado pelo timestamp dos eventos e os dados crescem à medida que os eventos acontecem em tempo real. Mais tipos de eventos podem ser incluídos no conjunto de dados a qualquer momento (não limitado a apenas A, B, C, D como no exemplo) e o mesmo tipo de evento pode aparecer na tabela várias vezes. O campo booleano Is_Active serve como forma de indicar se o evento ainda está ativo (1) ou não (0).
Nesse sentido, tentei fazer algumas transformações nesses dados usando SQL Window Functions. Não estou necessariamente restrito a um produto ou tecnologia específico, portanto, sinta-se à vontade para dizer como você resolveria o problema abaixo.
O que eu quero fazer é emparelhar dinamicamente cada evento do mesmo tipo quando eles têm valores Is_Active opostos e, em seguida, obter quanto tempo esse evento estava ativo. Em outras palavras, dado um evento X, eu precisaria obter o Event_Timestamp para ele quando Is_Active tivesse 1 pela primeira vez (Begin_Timestamp) e, em seguida, ignorar o restante das linhas para este evento X com Is_Active 1 até obter Is_Active 0 , para que eu pudesse pegar o Event_Timestamp novamente (End_Timestamp). Então, eu continuaria aplicando essa lógica quando encontrasse o evento X tendo 1 na coluna Is_Active novamente.
Um exemplo da tabela resultante seria:
Event_Type Begin_Timestamp End_Timestamp Duration
A 2010-10-01 00:00:00 2010-10-01 00:00:02 2 seconds
B 2010-10-01 00:00:01 2010-10-01 00:00:04 3 seconds
D 2010-10-01 00:00:03 null null
C 2010-10-01 00:00:05 null null
A 2010-10-01 00:00:06 2010-10-01 00:00:08 2 seconds
Existe alguma função de janela que me ajude a obter esses pares de eventos para que eu possa calcular a duração de cada evento?
Você precisa de algo como
Claro que você pode combiná-lo na consulta usando um CTE que calcula todos os valores da janela. O longo caminho acima é usado para explicar o algoritmo.
Dados os dados
Seu resultado usará alguns estágios para serem calculados (cada um em um CTE):
Se seus dados também contiverem mais de um evento final, você deverá ajustar o reconhecimento do evento final na instrução case. Isso produzirá o resultado que você esperava em seu post:
Não há necessidade de nenhum
Window Function
.Você pode testar meu script com dados de amostra diferentes e também me fornecer um cenário para teste de desempenho.
Na verdade, você deve fornecer
Real Table Schema
.