Torna all'elenco degli articoli Articoli
Tempo di lettura: 2 minuti

Come selezionare la prima riga di un gruppo?

Spesso si desidera selezionare una singola riga da ciascun gruppo GROUP BY. PostgreSQL ha un'istruzione specifica per questo: SELECT DISTINCT ON.

Supponiamo di voler selezionare un bollettino meteo per ogni località.

location time report
Ottawa 2014-05-15 8:00 sunny
2014-05-15 11:00 cloudy
2014-05-15 15:00 rainy
Warsaw 2014-05-15 8:00 overcast
2014-05-15 11:00 sunny
2014-05-15 15:00 rainy

SELECT DISTINCT ON (location) location, time, report
FROM weather_reports;

La query recupera un bollettino meteo per ogni località.

È possibile utilizzare diverse espressioni nell'istruzione SELECT DISTINCT ON.

SELECT DISTINCT ON (creation_date_week, resource_id) 
  id,
  creation_date, 
  date_trunc('week', creation_date) creation_date_week,
  resource_id
FROM backup_data;

Per ogni risorsa la query recupera un singolo dato di backup per ogni settimana.

SELECT DISTINCT ON con ORDER BY

L'istruzione SELECT DISTINCT ON non decorata seleziona una riga per ogni gruppo, ma non si sa quale delle righe sarà selezionata. Ogni esecuzione della query può restituire righe diverse. Utilizzare la clausola ORDER BY se si desidera selezionare una riga specifica.

SELECT DISTINCT ON (location) location, time, report
FROM weather_reports
ORDER BY location, time DESC;

La query recupera il bollettino meteo più recente per ogni località.

SELECT DISTINCT ON (creation_date_week, resource_id)
  id,
  creation_date, 
  date_trunc('week', creation_date) creation_date_week,
  resource_id
FROM backup_data
ORDER BY creation_date_week, resource_id, creation_date DESC;

Per ogni risorsa, la query seleziona i dati di backup più recenti di ogni settimana. Le espressioni SELECT DISTINCT ON devono essere ripetute all'inizio della clausola ORDER BY. È possibile aggiungere altre espressioni dopo di esse.

SELEZIONARE DISTINTO

Una clausola correlata è la clausola standard SELECT DISTINCT. La clausola standard elimina le righe duplicate. SELECT DISTINCT ON elimina le righe che duplicano le espressioni date.