La query più breve (e forse più veloce) sarebbe con DISTINCT ON
, un'estensione PostgreSQL dello standard SQL DISTINCT
clausola:
SELECT DISTINCT ON (1)
id, count, year
FROM tbl
ORDER BY 1, 2 DESC, 3;
I numeri si riferiscono alle posizioni ordinali nel SELECT
elenco. Puoi precisare i nomi delle colonne per maggiore chiarezza:
SELECT DISTINCT ON (id)
id, count, year
FROM tbl
ORDER BY id, count DESC, year;
Il risultato è ordinato per id
ecc. che possono o non possono essere i benvenuti. In ogni caso è meglio di "non definito".
Rompe anche i pareggi (quando più anni condividono lo stesso conteggio massimo) in un modo ben definito:scegli il primo anno. Se non ti interessa, rilascia year
dal ORDER BY
. Oppure scegli l'ultimo anno con year DESC
.
Per molti righe per id
, altre tecniche di query sono (molto) più veloci. Vedi:
- Seleziona prima riga in ogni gruppo GROUP BY?
- Ottimizza la query GROUP BY per recuperare l'ultima riga per utente