Heim >Datenbank >MySQL-Tutorial >Wie kann ich DISTINCT ON von PostgreSQL mit verschiedenen ORDER BY-Klauseln korrekt verwenden?

Wie kann ich DISTINCT ON von PostgreSQL mit verschiedenen ORDER BY-Klauseln korrekt verwenden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-21 12:14:14420Durchsuche

How Can I Correctly Use PostgreSQL's DISTINCT ON with Different ORDER BY Clauses?

Die DISTINCT ON- und ORDER BY-Interaktionen von PostgreSQL verstehen

Die DISTINCT ON-Klausel von PostgreSQL dient dazu, die erste Zeile aus jeder Gruppe von Zeilen auszuwählen, die in den angegebenen Ausdrücken dieselben Werte haben. Der entscheidende Punkt ist, dass die Auswahl der „ersten“ Zeile vollständig von der ORDER BY-Klausel abhängt. Sie müssen ausgerichtet sein.

Ein häufiger Fehler ist die Verwendung einer DISTINCT ON-Klausel mit einer ORDER BY-Klausel, die den/die DISTINCT ON-Ausdruck(e) nicht enthält. Dies führt zu unvorhersehbaren Ergebnissen, da die Auswahl der „ersten“ Zeile durch die Datenbank willkürlich wird.

Bestellprobleme mit DISTINCT ON korrigieren

Der Fehler tritt auf, wenn die Felder in DISTINCT ON nicht mit den führenden Feldern in ORDER BY übereinstimmen. Um dieses Problem zu beheben, stellen Sie sicher, dass die ORDER BY-Klausel mit denselben Ausdrücken beginnt wie DISTINCT ON. Dies garantiert eine konsistente und vorhersehbare Auswahl der ersten Reihe innerhalb jeder Gruppe.

Alternative Ansätze für „Greatest N per Group“-Probleme

Wenn das Ziel darin besteht, den letzten Kauf für jeden address_id, sortiert nach Kaufdatum, zu finden, handelt es sich um eine klassische Abfrage „größtes N pro Gruppe“. Hier sind zwei effiziente Lösungen:

Allgemeine SQL-Lösung:

Dieser Ansatz verwendet eine Unterabfrage, um das Maximum purchased_at für jedes address_id zu finden, und verknüpft es dann wieder mit der Originaltabelle, um die vollständige Zeile abzurufen.

<code class="language-sql">SELECT t1.* 
FROM purchases t1
JOIN (
    SELECT address_id, max(purchased_at) max_purchased_at
    FROM purchases
    WHERE product_id = 1
    GROUP BY address_id
) t2
ON t1.address_id = t2.address_id AND t1.purchased_at = t2.max_purchased_at
ORDER BY t1.purchased_at DESC</code>

PostgreSQL-spezifische Optimierung:

PostgreSQL bietet eine präzisere und möglicherweise schnellere Lösung mithilfe einer verschachtelten DISTINCT ON Abfrage:

<code class="language-sql">SELECT * FROM (
  SELECT DISTINCT ON (address_id) *
  FROM purchases 
  WHERE product_id = 1
  ORDER BY address_id, purchased_at DESC
) t
ORDER BY purchased_at DESC</code>

Diese Alternativen bieten sauberere und effizientere Lösungen im Vergleich zur alleinigen Verwendung von DISTINCT ON bei der Bewältigung von Szenarien mit der höchsten N pro Gruppe. Sie vermeiden unnötiges Sortieren und verbessern die Abfrageleistung.

Das obige ist der detaillierte Inhalt vonWie kann ich DISTINCT ON von PostgreSQL mit verschiedenen ORDER BY-Klauseln korrekt verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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