De kortste (en mogelijk snelste) zoekopdracht zou zijn met DISTINCT ON
, een PostgreSQL-extensie van de SQL-standaard DISTINCT
clausule:
SELECT DISTINCT ON (1)
id, count, year
FROM tbl
ORDER BY 1, 2 DESC, 3;
De nummers verwijzen naar ordinale posities in de SELECT
lijst. U kunt voor de duidelijkheid kolomnamen spellen:
SELECT DISTINCT ON (id)
id, count, year
FROM tbl
ORDER BY id, count DESC, year;
Het resultaat is gerangschikt op id
enz. die al dan niet welkom zijn. Het is in ieder geval beter dan "undefined".
Het verbreekt ook banden (wanneer meerdere jaren hetzelfde maximale aantal delen) op een goed gedefinieerde manier:kies het vroegste jaar. Als het je niet kan schelen, laat dan year
vallen uit de ORDER BY
. Of kies het laatste jaar met year DESC
.
Voor velen rijen per id
, zijn andere querytechnieken (veel) sneller. Zie:
- Selecteer eerst rij in elke GROUP BY-groep?
- Optimaliseer de GROUP BY-query om de laatste rij per gebruiker op te halen