C'est un cas d'utilisation parfait pour DISTINCT ON
- une extension spécifique à Postgres du standard DISTINCT
:
SELECT DISTINCT ON (category)
id -- , category, date -- any other column (expression) from the same row
FROM tbl
ORDER BY category, date DESC;
Attention au tri décroissant. Si la colonne peut être NULL, vous pouvez ajouter NULLS LAST
:
- Trier par colonne ASC, mais les valeurs NULL en premier ?
DISTINCT ON
est simple et rapide. Explication détaillée dans cette réponse connexe :
- Sélectionner la première ligne de chaque groupe GROUP BY ?
Pour les grands tableaux avec de nombreuses lignes par category
envisager une approche alternative :
- Optimiser la requête GROUP BY pour récupérer la dernière ligne par utilisateur
- Optimiser la requête maximale par groupe