La requête la plus courte (et peut-être la plus rapide) serait avec DISTINCT ON
, une extension PostgreSQL du standard SQL DISTINCT
clause :
SELECT DISTINCT ON (1)
id, count, year
FROM tbl
ORDER BY 1, 2 DESC, 3;
Les nombres font référence aux positions ordinales dans le SELECT
liste. Vous pouvez épeler les noms des colonnes pour plus de clarté :
SELECT DISTINCT ON (id)
id, count, year
FROM tbl
ORDER BY id, count DESC, year;
Le résultat est trié par id
etc. qui peuvent ou non être les bienvenus. C'est mieux que "undefined" dans tous les cas.
Il rompt également les égalités (lorsque plusieurs années partagent le même nombre maximum) d'une manière bien définie :choisissez l'année la plus ancienne. Si vous ne vous en souciez pas, supprimez year
à partir du ORDER BY
. Ou choisissez la dernière année avec year DESC
.
Pour beaucoup lignes par id
, les autres techniques de requête sont (beaucoup) plus rapides. Voir :
- Sélectionner d'abord rangée dans chaque groupe GROUP BY ?
- Optimiser la requête GROUP BY pour récupérer la dernière ligne par utilisateur