sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL MAX en GROUP BY

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:



  1. Hoe de MySQL-versie te controleren?

  2. Ga door met Postgres-transactie met uitzonderingen in Java

  3. Arabische tekstuitvoer php mysql utf-8 conversieprobleem

  4. Waarom toont SELECT * FROM table INNER JOIN..ON de kruisende kolom twee keer?