Tenho uma tabela trips
com as seguintes informações
Linha | Do utilizador | carimbo de data/hora | Evento |
---|---|---|---|
1 | 1 | 29/06/2022 17:18:03 | Andando |
2 | 1 | 29/06/2022 17:18:02 | Andando |
3 | 1 | 29/06/2022 17:18:01 | Começar |
4 | 1 | 28/06/2022 19:21:03 | Andando |
5 | 1 | 28/06/2022 19:21:02 | Andando |
6 | 1 | 28/06/2022 19:21:01 | Começar |
7 | 2 | 27/06/2022 17:36:03 | Andando |
8 | 2 | 27/06/2022 17:36:02 | Andando |
9 | 2 | 27/06/2022 17:36:01 | Começar |
10 | 2 | 27/06/2022 16:55:03 | Andando |
11 | 2 | 27/06/2022 16:55:02 | Andando |
12 | 2 | 27/06/2022 16:55:01 | Começar |
Eu gostaria de adicionar uma coluna que agrupe os usuários por User
, classifique por Timestamp
ordem decrescente e, em seguida, identifique diferentes viagens sempre que 'Start' for seguido por 'Walking'. As viagens identificadas devem receber um número de viagem em Trip nr
.
Linha | Do utilizador | carimbo de data/hora | Evento | Nº da viagem |
---|---|---|---|---|
1 | 1 | 29/06/2022 17:18:03 | Andando | 4 |
2 | 1 | 29/06/2022 17:18:02 | Andando | 4 |
3 | 1 | 29/06/2022 17:18:01 | Começar | 4 |
4 | 1 | 28/06/2022 19:21:03 | Andando | 3 |
5 | 1 | 28/06/2022 19:21:02 | Andando | 3 |
6 | 1 | 28/06/2022 19:21:01 | Começar | 3 |
7 | 2 | 27/06/2022 17:36:03 | Andando | 2 |
8 | 2 | 27/06/2022 17:36:02 | Andando | 2 |
9 | 2 | 27/06/2022 17:36:01 | Começar | 2 |
10 | 2 | 27/06/2022 16:55:03 | Andando | 1 |
11 | 2 | 27/06/2022 16:55:02 | Andando | 1 |
12 | 2 | 27/06/2022 16:55:01 | Começar | 1 |
Como posso conseguir isso de forma otimizada?
Este é um exemplo de um padrão SQL chamado lacunas e ilhas. O objetivo é associar um ID de agrupamento único a cada "ilha", então você pode usar
GROUP BY
para separá-los.A primeira etapa é determinar onde há uma lacuna entre cada ilha, no sentido SQL. Para o seu caso, você já sinaliza cada nova ilha chamando-a
Start
. A próxima etapa é atribuir um ID exclusivo a cada bloco encabeçado por umStart
. Para criar esse ID, usamos uma soma contínua sobre uma coluna que é 1 quando a linha é aStart
e 0 caso contrário. Acontece que a coluna da soma contínua é idêntica à suaTrip Nr
coluna. Agora temos cada viagem identificada exclusivamente.Violino de demonstração .
A consulta final é: