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 deJOINpara a mesa base novamente.
-
Use a extensão Postgres do SQL padrãoDISTINCT:DISTINCT ON:
-
O Postgres tem um tipo booleano adequado. Você podeORDER BYexpressão booleana diretamente. A sequência éFALSE(0),TRUE(1),NULL(NULO). Se a for NULL, esta expressão seráFALSEe classifica primeiro:(a IS NOT NULL). O resto é ordenado porid. Voilá.
-
Seleção deIDacontece 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.