PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

SQL dois critérios de um group-by


Isso pode ser radicalmente mais simples :
SELECT DISTINCT ON (b, c, e, f)
       b, c, e, f, id   -- add more columns freely
FROM   (<duplicate query here>) sub
ORDER  BY b, c, e, f, (a IS NOT NULL), id

  • Sua consulta duplicada tem todas as colunas. Não há necessidade de JOIN para a mesa base novamente.

  • Use a extensão Postgres do SQL padrão DISTINCT :DISTINCT ON :

  • O Postgres tem um tipo booleano adequado. Você pode ORDER BY expressão booleana diretamente. A sequência é FALSE (0), TRUE (1), NULL (NULO). Se a for NULL, esta expressão será FALSE e classifica primeiro:(a IS NOT NULL) . O resto é ordenado por id . Voilá.

  • Seleção de ID acontece automaticamente. De acordo com sua descrição, você deseja o ID da linha selecionada nesta consulta. Nada mais a fazer.

  • Você provavelmente pode integrar isso diretamente à sua consulta duplicada.