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 deJOIN
para a mesa base novamente.
-
Use a extensão Postgres do SQL padrãoDISTINCT
:DISTINCT ON
:
-
O Postgres tem um tipo booleano adequado. Você podeORDER 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 porid
. Voilá.
-
Seleção deID
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.