Die kürzeste (und möglicherweise schnellste) Abfrage wäre mit DISTINCT ON
, eine PostgreSQL-Erweiterung des SQL-Standards DISTINCT
Klausel:
SELECT DISTINCT ON (1)
id, count, year
FROM tbl
ORDER BY 1, 2 DESC, 3;
Die Zahlen beziehen sich auf Ordinalstellen im SELECT
aufführen. Zur Verdeutlichung können Sie Spaltennamen buchstabieren:
SELECT DISTINCT ON (id)
id, count, year
FROM tbl
ORDER BY id, count DESC, year;
Das Ergebnis ist nach id
geordnet usw., die willkommen sein können oder nicht. Es ist auf jeden Fall besser als "undefiniert".
Es bricht auch Bindungen (wenn mehrere Jahre dieselbe maximale Anzahl haben) auf eine genau definierte Weise:Wählen Sie das früheste Jahr. Wenn es Ihnen egal ist, lassen Sie year
fallen aus dem ORDER BY
. Oder wählen Sie das neueste Jahr mit year DESC
.
Für viele Zeilen pro id
, andere Abfragetechniken sind (viel) schneller. Siehe:
- Zuerst auswählen Zeile in jeder GROUP BY-Gruppe?
- GRUPPE NACH-Abfrage optimieren, um die neueste Zeile pro Benutzer abzurufen