Imagine algo como "uber Eats":
há uma base de motoristas (shopping), outros restaurantes fora do shopping e locais de clientes.
Cada fila é uma viagem entre dois pontos (base, restaurante_# e cliente #): pode ter serviços com 3 filas (base-restaurante-base-cliente) outro com 2 (base-cliente-base), outro com um pouco mais. ... (pedido errado :)) de parada de combustível.
Precisa agregar para cada serviço as linhas aplicáveis a esse serviço em uma coluna , por exemplo, service_numb com um número de série começando cada mês e o mês, 1/month,2/month ,3/month.
existe uma coluna:
- Base, onde "OUT" e "IN" indicam a saída da base e a base de retorno, então este deve ser o gatilho para um novo serviço.
- linha de data, para sequenciamento/ordem
- carrinho, para identificar o carrinho de entrega, entre muitos
isso deve ser executado apenas uma vez para preencher essa coluna, em vez de fazê-lo manualmente.
é possível no postgresSQL 13.6 ?
EDITAR:
Com uma mesa:
data hora | carrinho | base |
---|---|---|
2022 08 23 10:10 | aa | FORA |
2022 08 23 10:20 | aa | |
2022 08 23 10:30 | aa | DENTRO |
2022 08 23 10:05 | bb | FORA |
2022 08 23 10:10 | bb | |
2022 08 23 10:30 | bb | |
2022 08 23 10:35 | bb | DENTRO |
2022 09 23 10:10 | aa | FORA |
2022 09 23 10:20 | aa | |
2022 09 23 10:30 | aa | DENTRO |
necessário criar uma coluna adicional com o número do serviço, ano/mês e por carrinho, como:
data hora | carrinho | base | núm_serviço |
---|---|---|---|
2022 08 23 10:10 | aa | FORA | aa/202208/1 |
2022 08 23 10:20 | aa | aa/202208/1 | |
2022 08 23 10:30 | aa | DENTRO | aa/202208/1 |
2022 08 23 10:05 | bb | FORA | bb/202208/1 |
2022 08 23 10:10 | bb | bb/202208/1 | |
2022 08 23 10:30 | bb | bb/202208/1 | |
2022 08 23 10:35 | bb | DENTRO | bb/202208/1 |
2022 09 23 10:10 | aa | FORA | aa/202209/1 |
2022 09 23 10:20 | aa | aa/202209/1 | |
2022 09 23 10:30 | aa | DENTRO | aa/202209/1 |
EDIT2:
SELECT *,SUM(CASE WHEN base='OUT' then 1 end) OVER (PARTITION BY cart ORDER BY datetime) AS m1
FROM table
ORDER BY datetime
já dá um número sequencial em toda a tabela, dividido por carrinho.
faltando: adicionar carrinho, aaaa/mm e reiniciar a numeração a cada mês e por carrinho
EDIT3:
usando a resposta fornecida abaixo por @Andriy M, já está funcionando, o único problema é nos casos em que uma ou mais das pernas "saltam" para o próximo mês?
exemplo: perna1 31/07/2022 23:30 perna2 01/08/2022 00:05 perna3 01/08/2022 00:35
para o mesmo service_number. O datetime, já está na linha do tempo, então não há problema. A questão parece estar no PARTITION BY do datetime, para acomodar a passagem para um novo mês.
Seus
service_num
valores parecem consistir nestes três componentes delimitados por um/
:cart
;datetime
formatado comoYYYYMM
;Nada precisa ser feito sobre
cart
, basta usá-lo na expressão de concatenação final.Em relação ao mês formatado, você pode obtê-lo como
E quanto aos números de sequência, sua
SUM
expressão é um bom começo. Você precisa particionar adicionalmente por meses para que os números sejam redefinidos a cada mês. Você pode usar a expressão do mês acima como o segundo critério de partição:Ou você pode usar a
date_trunc
função, que pode ou não ser mais rápida:Com todos os componentes agora cobertos, você só precisa concatená-los em um único
service_num
valor: