Tenho uma tabela PostgreSQL df
com as seguintes informações:
área_id | trip_nr | carimbo de data/hora |
---|---|---|
a | 3 | 29/06/2022 17:18:03 |
a | 2 | 29/06/2022 17:18:02 |
a | 1 | 29/06/2022 17:18:01 |
b | 1 | 28/06/2022 19:21:03 |
c | 3 | 28/06/2022 19:21:02 |
e | 3 | 28/06/2022 19:21:01 |
e | 2 | 27/06/2022 17:36:03 |
c | 2 | 27/06/2022 17:36:02 |
c | 1 | 27/06/2022 17:36:01 |
e | 1 | 27/06/2022 16:55:03 |
Gostaria de adicionar uma coluna continuous
que verifica se o trip_nr
para um determinado area_id
segue cronologicamente desde a primeira visita com base na ordem de timestamp
.
Em outras palavras, continuous=True
se an area_id
for visitado pela enésima vez e as visitas anteriores foram iguais area_id
desde n, n-1,...,1.
E, continuous=False
se an area_id
for visitado pela enésima vez, mas um diferente area_id
foi visitado em algum lugar entre as visitas n, n-1,...,1 (ou seja, a sequência de trip_nr
's é quebrada em algum ponto).
Um exemplo da saída desejada:
área_id | trip_nr | carimbo de data/hora | contínuo |
---|---|---|---|
a | 3 | 29/06/2022 17:18:03 | Verdadeiro |
a | 2 | 29/06/2022 17:18:02 | Verdadeiro |
a | 1 | 29/06/2022 17:18:01 | Verdadeiro |
b | 1 | 28/06/2022 19:21:03 | Verdadeiro |
c | 3 | 28/06/2022 19:21:02 | Falso |
e | 3 | 28/06/2022 19:21:01 | Falso |
e | 2 | 27/06/2022 17:36:03 | Falso |
c | 2 | 27/06/2022 17:36:02 | Verdadeiro |
c | 1 | 27/06/2022 17:36:01 | Verdadeiro |
e | 1 | 27/06/2022 16:55:03 | Verdadeiro |
Como posso conseguir isso de forma otimizada? As respostas Clickhouse/SQL também são bem-vindas.
Observe que o carimbo de data/hora não é necessariamente armazenado em ordem.
Supondo que todas as colunas envolvidas
NOT NULL
e nenhum carimbo de data/hora duplicado porarea_id
.Aspecto indefinido: e se o mesmo
area_id
for visitado novamente (após um intervalo) e recomeçar comtrip_nr = 1
. Ainda "contínuo"?Apenas a primeira viagem por área é “contínua”
Múltiplas viagens "contínuas" por área
violino
Como?
Subtraia o número da linha por partição do
area_id
número total de linhas e, em seguida, as linhas contínuas produzem o mesmo grupo (grp
) porarea_id
. Cada lacuna inicia um novo grupo.Em seguida, verifique se o número da linha em cada um desses grupos corresponde ao arquivo
trip_nr
.(E se é o primeiro grupo por
area_id
?)Relacionado: