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