AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 315911
Accepted
domiho1
domiho1
Asked: 2022-08-23 11:13:09 +0800 CST2022-08-23 11:13:09 +0800 CST 2022-08-23 11:13:09 +0800 CST

Adicionar valor em uma coluna com base nos valores de um grupo de linhas

  • 772

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.

postgresql
  • 1 1 respostas
  • 75 Views

1 respostas

  • Voted
  1. Best Answer
    Andriy M
    2022-08-24T16:40:03+08:002022-08-24T16:40:03+08:00

    Seus service_numvalores parecem consistir nestes três componentes delimitados por um /:

    • cart;
    • expressão que representa o mês de datetimeformatado como YYYYMM;
    • expressão enumerando sequências OUT/IN.

    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

    to_char(datetime, 'YYYYMM')
    

    E quanto aos números de sequência, sua SUMexpressã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:

    SUM(CASE WHEN base='OUT' THEN 1 END)
    OVER (PARTITION BY cart, to_char(datetime, 'YYYYMM') ORDER BY datetime)
    

    Ou você pode usar a date_truncfunção, que pode ou não ser mais rápida:

    SUM(CASE WHEN base='OUT' THEN 1 END)
    OVER (PARTITION BY cart, date_trunc('month', datetime) ORDER BY datetime)
    

    Com todos os componentes agora cobertos, você só precisa concatená-los em um único service_numvalor:

    SELECT
      *
    , cart
      || '/'
      || to_char(datetime, 'YYYYMM')
      || '/'
      || SUM(CASE WHEN base='OUT' THEN 1 END)
         OVER (PARTITION BY cart, date_trunc('month', datetime) ORDER BY datetime)
      AS service_num
    FROM
      YourTable
    ORDER BY
      datetime
    ;
    
    • 0

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve