La consulta más corta (y posiblemente la más rápida) sería con DISTINCT ON
, una extensión PostgreSQL del estándar SQL DISTINCT
cláusula:
SELECT DISTINCT ON (1)
id, count, year
FROM tbl
ORDER BY 1, 2 DESC, 3;
Los números se refieren a posiciones ordinales en el SELECT
lista. Puede deletrear los nombres de las columnas para mayor claridad:
SELECT DISTINCT ON (id)
id, count, year
FROM tbl
ORDER BY id, count DESC, year;
El resultado está ordenado por id
etc. que pueden o no ser bienvenidos. Es mejor que "indefinido" en cualquier caso.
También rompe empates (cuando varios años comparten el mismo recuento máximo) de una manera bien definida:elija el año más antiguo. Si no le importa, suelte year
del ORDER BY
. O elige el último año con year DESC
.
Para muchos filas por id
, otras técnicas de consulta son (mucho) más rápidas. Ver:
- Seleccionar primero fila en cada grupo GROUP BY?
- Optimizar la consulta GROUP BY para recuperar la fila más reciente por usuario