Esto puede ser radicalmente más simple :
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
-
Su consulta duplicada tiene todas las columnas. No es necesario
JOIN
a la tabla base de nuevo. -
Use la extensión Postgres del SQL estándar
DISTINCT
:DISTINCT ON
: -
Postgres tiene un tipo booleano adecuado. Puedes
ORDER BY
expresión booleana directamente. La secuencia esFALSE
(0),TRUE
(1),NULL
(NULO). Si a es NULL, esta expresión esFALSE
y ordena primero:(a IS NOT NULL)
. El resto está ordenado porid
. Voilá. -
Selección de
ID
ocurre automáticamente. De acuerdo con su descripción, desea el ID de la fila seleccionada en esta consulta. Nada más que hacer. -
Probablemente pueda integrar esto en su consulta duplicada directamente.