Heim >Datenbank >MySQL-Tutorial >Wie kann ich DISTINCT ON von PostgreSQL mit verschiedenen ORDER BY-Klauseln korrekt verwenden?
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!