Heim > Datenbank > MySQL-Tutorial > Wie finde ich die erste Zeile in jeder Gruppe mithilfe der DISTINCT ON-Klausel von PostgreSQL?

Wie finde ich die erste Zeile in jeder Gruppe mithilfe der DISTINCT ON-Klausel von PostgreSQL?

Barbara Streisand
Freigeben: 2025-01-25 20:17:18
Original
305 Leute haben es durchsucht

How to Find the First Row in Each Group Using PostgreSQL's DISTINCT ON Clause?

Finden Sie die erste Zeile in jeder Gruppierung mit der DISTINCT ON-Klausel von PostgreSQL

Einführung

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.

Abfragestruktur

<code class="language-sql">SELECT DISTINCT ON (grouping_expression)
       selected_columns
FROM   table_name
ORDER  BY grouping_expression, additional_ordering_expression(s)</code>
Nach dem Login kopieren

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.

Beispiel

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>
Nach dem Login kopieren

und die folgenden Daten:

<code class="language-sql">INSERT INTO purchases (customer, total) VALUES
('Joe', 5),
('Sally', 3),
('Joe', 2),
('Sally', 1);</code>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Ausgabe:

<code>id | customer | total
-----------------------------
1  | Joe      | 5
2  | Sally    | 3</code>
Nach dem Login kopieren

NULL-Wert

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>
Nach dem Login kopieren

Wählen Sie eine andere Spalte aus

SELECTListen 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.

Leistungshinweise

DISTINCT ONDie 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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage