Retour à la liste des articles Articles
2 minutes de lecture

Comment sélectionner la première ligne d'un groupe ?

Souvent, vous souhaitez sélectionner une seule ligne dans chaque groupe GROUP BY. PostgreSQL dispose d'une instruction spécialement conçue pour cela : SELECT DISTINCT ON.

Disons que je veux sélectionner un bulletin météo pour chaque lieu.

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 requête récupère un bulletin météo pour chaque lieu.

Vous pouvez utiliser plusieurs expressions dans l'instruction 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;

Pour chaque ressource, la requête récupère une seule donnée de sauvegarde pour chaque semaine.

SELECT DISTINCT ON avec ORDER BY

L'instruction SELECT DISTINCT ON sans ordre sélectionne une ligne pour chaque groupe, mais vous ne savez pas laquelle des lignes sera sélectionnée. Chaque exécution de la requête peut renvoyer des lignes différentes. Utilisez la clause ORDER BY si vous souhaitez sélectionner une ligne spécifique.

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

La requête récupère le rapport météo le plus récent pour chaque lieu.

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;

Pour chaque ressource, la requête sélectionne les données de sauvegarde les plus récentes de chaque semaine. Les expressions SELECT DISTINCT ON doivent être répétées au début de la clause ORDER BY. Vous pouvez ajouter des expressions supplémentaires après elles.

SELECT DISTINCT

Une clause apparentée est la clause standard SELECT DISTINCT. La clause standard élimine les lignes en double. SELECT DISTINCT ON élimine les lignes en double des expressions données.