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 / 333554
Accepted
Leonard
Leonard
Asked: 2023-11-29 18:13:56 +0800 CST2023-11-29 18:13:56 +0800 CST 2023-11-29 18:13:56 +0800 CST

Compreendendo o impacto de ORDER BY em funções de janela em outras partições no PostgreSQL

  • 772

Eu tenho uma tabela simples odd_numscom colunas nume odd:

create table odd_nums
(
    num numeric,
    odd numeric
);

INSERT INTO odd_nums VALUES (0, 0);
INSERT INTO odd_nums VALUES (1, 1);
INSERT INTO odd_nums VALUES (2, 0);
INSERT INTO odd_nums VALUES (3, 1);

Estou brincando com funções de janela. Esta consulta produz os resultados esperados:

SELECT num,
       FIRST_VALUE(num) OVER (PARTITION BY odd) a,
       FIRST_VALUE(num) OVER (PARTITION BY odd) b
FROM odd_nums;
número a b
0 0 0
2 0 0
1 1 1
3 1 1

Quando ordeno a partição em coluna, bos resultados mudam assim:

SELECT NUM,
       FIRST_VALUE(num) OVER (PARTITION BY odd)                   a,
       FIRST_VALUE(num) OVER (PARTITION BY odd ORDER BY num DESC) b
FROM odd_nums;
número a b
2 2 2
0 2 2
3 3 3
1 3 3

Coluna bé o que eu esperaria, mas por que a coluna atambém está mudando?

DB violino

Alguém pode me ajudar a entender por que adicionar a ORDER BY num DESCcláusula na função da segunda janela causa uma alteração na função da primeira janela? Existe algum detalhe específico de implementação ou otimização do banco de dados que possa estar afetando o resultado?

Examinei a documentação do PostgreSQL, mas sem sucesso.

postgresql
  • 2 2 respostas
  • 139 Views

2 respostas

  • Voted
  1. Best Answer
    J.D.
    2023-11-29T21:31:10+08:002023-11-29T21:31:10+08:00

    Pense nos seus dados como uma pilha de roupas, onde a oddcoluna armazena o id de um tipo de roupa (camisa, calça, meia, etc). A PARTITIONcláusula on oddequivale a organizar as roupas em pilhas separadas por cada tipo. Portanto, uma pilha de roupas é composta apenas de camisas, outra pilha é composta apenas de meias. Então, a FIRST_VALUE()função da janela em si é como se alguém lhe dissesse: dê-me a primeira peça de roupa de cada pilha.

    Bem, uma pilha de roupas está desorganizada, então qual peça de roupa é a primeira em cada pilha? Você pode pegar uma camisa azul e meias vermelhas, aleatoriamente, na primeira vez. Se você colocar essas roupas de volta nas respectivas pilhas e fizer isso de novo, poderá acabar com uma camisa verde e meias roxas.

    Estes são seus dados. Não há ordem até que você especifique explicitamente uma em uma consulta que está buscando esses dados. A maioria das funções de janela não faz sentido sem uma ORDER BYcláusula. Sem ele, os dados retornados são semi-aleatórios e conhecidos como não determinísticos .

    Quando você adiciona a ORDER BYcláusula à sua consulta, é como pegar suas pilhas de roupas e dispor as peças em uma linha, ordenadas, digamos, por tamanho. Agora, toda vez que alguém lhe pedir a primeira peça de roupa de cada linha, você sempre puxará a menor camisa, as menores meias, etc., repetidamente. Isso é conhecido como determinístico. O mesmo vale para seus dados, certifique-se de ordená-los explicitamente ao usar funções de janela que dependem de ordenação (por exemplo, FIRST_VALUE()).

    E por que a acoluna acabou seguindo a mesma ordem da bcoluna quando a função de janela da acoluna não usa uma ORDER BYcláusula: os sistemas de banco de dados são preguiçosos, também conhecidos como eficientes. Isso irá variar um pouco de um sistema de banco de dados para outro, e não há garantia de que você sempre verá o mesmo comportamento com base em um grande número de fatores de como funciona o mecanismo SQL do sistema de banco de dados específico. Mas, como observou jjanes, para ser mais eficiente, quando não viu nenhuma ordem específica fornecida para a acoluna, provavelmente reutilizou a lista de dados já classificada da bcoluna para ser mais eficiente. Classificar algo uma vez é mais eficiente do que classificar a mesma coisa de duas maneiras diferentes.

    • 3
  2. jjanes
    2023-11-29T20:35:47+08:002023-11-29T20:35:47+08:00

    Sem ORDER BY, a expressão é subdeterminada. Existem múltiplas respostas possíveis, das quais retorna a mais conveniente para calcular. Depois que uma expressão ganha um ORDER BY, torna-se mais conveniente aplicar a mesma ordem também à outra expressão.

    • 2

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