Zurück zur Artikelliste Artikel
2 Leseminuten

Wie wählt man die erste Zeile in einer Gruppe aus?

Oft möchte man eine einzelne Zeile aus jeder GROUP BY-Gruppe auswählen. PostgreSQL hat eine Anweisung speziell dafür: SELECT DISTINCT ON.

Nehmen wir an, ich möchte einen Wetterbericht für jeden Ort auswählen.

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;

Die Abfrage ruft für jeden Ort einen Wetterbericht ab.

Sie können mehrere Ausdrücke in der SELECT DISTINCT ON-Anweisung verwenden.

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

Für jede Ressource ruft die Abfrage eine einzelne Datensicherung für jede Woche ab.

SELECT DISTINCT ON mit ORDER BY

Das unverzierte SELECT DISTINCT ON wählt eine Zeile für jede Gruppe aus, aber Sie wissen nicht, welche der Zeilen ausgewählt wird. Jede Ausführung der Abfrage kann unterschiedliche Zeilen zurückgeben. Verwenden Sie die ORDER BY-Klausel, wenn Sie eine bestimmte Zeile auswählen möchten.

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

Die Abfrage ruft den aktuellsten Wetterbericht für jeden Ort ab.

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;

Für jede Ressource wählt die Abfrage die neuesten Sicherungsdaten in jeder Woche aus. Die SELECT DISTINCT ON-Ausdrücke müssen am Anfang der ORDER BY-Klausel wiederholt werden. Sie können zusätzliche Ausdrücke nach ihnen hinzufügen.

SELECT DISTINCT

Eine verwandte Klausel ist die Standardklausel SELECT DISTINCT. Mit der Standardklausel werden doppelte Zeilen eliminiert. SELECT DISTINCT ON eliminiert Zeilen, die die angegebenen Ausdrücke duplizieren.