Bei der Verarbeitung gruppierter Daten müssen Sie normalerweise die erste Zeile in jeder Gruppierung extrahieren. Diese Aufgabe kann mithilfe der DISTINCT ON
-Klausel, einer PostgreSQL-spezifischen Erweiterung, erfüllt werden.
<code class="language-sql">SELECT DISTINCT ON (grouping_expression) selected_columns FROM table_name ORDER BY grouping_expression, additional_ordering_expression(s)</code>
grouping_expression: Ausdruck, der zum Definieren der Gruppierung verwendet wird. Der führende Ausdruck in dieser Klausel muss mit dem Ausdruck in der folgenden ORDER BY
-Klausel übereinstimmen.
selected_columns: Die in der Ausgabe abzurufenden Spalten.
additional_ordering_expression(s): Optionaler Ausdruck, der verwendet wird, um die Reihenfolge der Zeilen innerhalb jeder Gruppierung zu bestimmen. Diese Ausdrücke müssen dem Gruppierungsausdruck in der ORDER BY
-Klausel folgen.
Betrachten Sie die purchases
-Tabelle mit dem folgenden Schema:
<code class="language-sql">CREATE TABLE purchases ( id SERIAL PRIMARY KEY, customer VARCHAR(50) NOT NULL, total NUMERIC(10, 2) NOT NULL );</code>
und die folgenden Daten:
<code class="language-sql">INSERT INTO purchases (customer, total) VALUES ('Joe', 5), ('Sally', 3), ('Joe', 2), ('Sally', 1);</code>
Um den Kunden mit dem höchsten Gesamtkaufbetrag abzurufen, verwenden Sie die folgende Abfrage:
<code class="language-sql">SELECT DISTINCT ON (customer) id, customer, total FROM purchases ORDER BY customer, total DESC, id;</code>
Ausgabe:
<code>id | customer | total ----------------------------- 1 | Joe | 5 2 | Sally | 3</code>
Wenn der gruppierte Wert NULL-Werte enthalten kann, wird empfohlen, ORDER BY
zur NULLS LAST
-Klausel hinzuzufügen, um sicherzustellen, dass Zeilen mit Nicht-NULL-Werten zuerst verarbeitet werden:
<code class="language-sql">ORDER BY customer, total DESC NULLS LAST, id;</code>
SELECT
Listen sind nicht auf das Gruppieren von Ausdrücken beschränkt. Es können beliebige zusätzliche Spalten eingefügt werden, wodurch diese Technik zum Ersetzen komplexer Unterabfragen oder Aggregat-/Fensterfunktionen nützlich ist.
DISTINCT ON
Die Effizienz der Abfrage hängt von der Verteilung der Daten und der Anzahl der Zeilen in jeder Gruppierung ab. Für kleine Gruppen ist es normalerweise sehr effizient. Bei großen Gruppierungen kann jedoch die unter dem folgenden Link beschriebene alternative Technik eine bessere Leistung liefern:
Das obige ist der detaillierte Inhalt vonWie finde ich die erste Zeile in jeder Gruppe mithilfe der DISTINCT ON-Klausel von PostgreSQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!