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 / 316783
Accepted
AndreKR
AndreKR
Asked: 2022-09-12 16:43:40 +0800 CST2022-09-12 16:43:40 +0800 CST 2022-09-12 16:43:40 +0800 CST

Gerar números sequenciais em uma junção

  • 772

Para cada linha do lado direito em um JOIN, gostaria de criar um número sequencial, começando em 1 (ou 0) para cada linha do lado esquerdo.

Exemplo:

create table persons (person_id int, person_name text);
create table places (place_id int, person_id int, place_name text);
insert into persons values (10, 'Aulus Agerius'), (20, 'Numerius Negidius');
insert into places values (10, 10, 'Anytown'), (20, 10, 'Timbuktu'), (30, 20, 'Podunk');
select person_name, place_name
from persons join places using (person_id)
order by person_id, place_id;

violino

Resultado desejado:

nome_pessoa coloque o nome place_seq
Aulo Agerio Qualquer cidade 1
Aulo Agerio Timbuctu 2
Numerius Negidius Podunk 1

Então, por exemplo, um 2 in place_seqsignificaria "este é o 2º lugar encontrado para esta pessoa".

Como criar a place_seqcoluna?

postgresql
  • 1 1 respostas
  • 315 Views

1 respostas

  • Voted
  1. Best Answer
    Vérace
    2022-09-12T17:53:51+08:002022-09-12T17:53:51+08:00

    Você precisa da função de janela ROW_NUMBER()( manual ) da seguinte forma (o código abaixo é mostrado no violino aqui - baseado em seu próprio violino +1 para isso!):

    SELECT 
      person_id,
      place_id,
      person_name, 
      place_name, 
      ROW_NUMBER() 
        OVER (PARTITION BY person_id ORDER BY place_id) AS rn
    FROM persons 
      JOIN places using (person_id)
    ORDER BY person_id, place_id;
    

    Isso é baseado na suposição de que person_id& place_idsão pelo menos UNIQUEou (melhor) os PRIMARY KEYs de suas respectivas tabelas. É concebível que duas pessoas possam ter o mesmo nome - eu conheci dois conjuntos de três pessoas (independentes - não a mesma família) com o mesmo nome. Quanto aos lugares, as duplicatas são ainda mais comuns.

    Resultado:

    person_name       place_name    rn
    Aulus Agerius        Anytown     1
    Aulus Agerius       Timbuktu     2
    Numerius Negidius     Podunk     1
    

    Para garantir a obtenção de resultados consistentes em diferentes execuções, ORDER BYé necessária uma cláusula determinística na função de janela. Em geral, uma instrução SQL deve conter um ORDER BY, assim como as funções de janela, se desejarmos resultados em ordem determinística.

    Para funções de janela, veja também aqui e aqui . Essas funções são muito poderosas e compensarão qualquer esforço gasto em aprendê-las muitas vezes. Existem artigos em toda a web sobre eles - eu recomendo que você dê uma olhada e pratique até ter (algum grau de) domínio deles.

    Como primeira escala, recomendo vivamente a apresentação de Bruce Momjian no YouTube aqui (slides aqui ). Bruce Momjian é VP e "Postgres Evangelist" para EnterpriseDB - a principal empresa de PostgreSQL do mundo. Ele também é um excelente palestrante e explica muito bem a funcionalidade do PostgreSQL!

    • 5

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