A consulta mais curta (e possivelmente mais rápida) seria com
DISTINCT ON
, uma extensão PostgreSQL do padrão SQL DISTINCT
cláusula:SELECT DISTINCT ON (1)
id, count, year
FROM tbl
ORDER BY 1, 2 DESC, 3;
Os números referem-se a posições ordinais no
SELECT
Lista. Você pode soletrar os nomes das colunas para maior clareza:SELECT DISTINCT ON (id)
id, count, year
FROM tbl
ORDER BY id, count DESC, year;
O resultado é ordenado por
id
etc. que podem ou não ser bem-vindos. É melhor do que "indefinido" em qualquer caso. Também desempate (quando vários anos compartilham a mesma contagem máxima) de uma maneira bem definida:escolha o ano mais antigo. Se você não se importa, solte
year
do ORDER BY
. Ou escolha o ano mais recente com year DESC
. Para muitos linhas por
id
, outras técnicas de consulta são (muito) mais rápidas. Ver:- Selecione primeiro linha em cada grupo GROUP BY?
- Otimize a consulta GROUP BY para recuperar a última linha por usuário