Este é um caso de uso perfeito para
DISTINCT ON
- uma extensão específica do Postgres do padrão DISTINCT
:SELECT DISTINCT ON (category)
id -- , category, date -- any other column (expression) from the same row
FROM tbl
ORDER BY category, date DESC;
Cuidado com a ordem de classificação decrescente. Se a coluna pode ser NULL, você pode querer adicionar
NULLS LAST
:- Classificar por coluna ASC, mas primeiro com valores NULL?
DISTINCT ON
é simples e rápido. Explicação detalhada nesta resposta relacionada:- Selecionar a primeira linha em cada grupo GROUP BY?
Para tabelas grandes com muitas linhas por
category
considere uma abordagem alternativa:- Otimize a consulta GROUP BY para recuperar a última linha por usuário
- Otimizar a consulta máxima em grupo