Heim >Datenbank >MySQL-Tutorial >Wie kann man in SQL effizient Minimal- und Maximalwerte pro Gruppe finden, ohne Ranking-Funktionen zu verwenden?

Wie kann man in SQL effizient Minimal- und Maximalwerte pro Gruppe finden, ohne Ranking-Funktionen zu verwenden?

Linda Hamilton
Linda HamiltonOriginal
2024-12-23 22:32:17738Durchsuche

How to Efficiently Find Minimum and Maximum Values per Group in SQL Without Using Ranking Functions?

Höchste und kleinste Werte pro Gruppe abrufen

Übersicht

Dieses Tutorial befasst sich mit der Frage, wie Datensätze mit den höchsten oder kleinsten Werten für a abgerufen werden angegebenes Feld innerhalb jeder Gruppe, ohne sich auf die Rangfolge (@Rank) zu verlassen. Während diese erste Frage @Rank als Lösung verwendete, zeigen nachfolgende Antworten einen effizienteren Ansatz mithilfe von Joins.

Lösung

Um die Zeile mit dem höchsten OrderField für jede Gruppe zu erhalten, verwenden Sie ein linkes Äußeres Join und die folgende Abfrage:

SELECT t1.*
FROM `Table` AS t1
LEFT OUTER JOIN `Table` AS t2
  ON t1.GroupId = t2.GroupId AND t1.OrderField < t2.OrderField
WHERE t2.GroupId IS NULL
ORDER BY t1.OrderField;

Wenn mehrere Datensätze innerhalb einer Gruppe dasselbe OrderField haben und Sie einen davon benötigen, können Sie die Bedingung erweitern als folgt:

SELECT t1.*
FROM `Table` AS t1
LEFT OUTER JOIN `Table` AS t2
  ON t1.GroupId = t2.GroupId 
        AND (t1.OrderField < t2.OrderField 
         OR (t1.OrderField = t2.OrderField AND t1.Id < t2.Id))
WHERE t2.GroupId IS NULL

Diese verfeinerte Abfrage stellt sicher, dass t1 nur zurückgegeben wird, wenn keine andere Zeile t2 innerhalb derselben Gruppen-GroupId vorhanden ist, die entweder einen höheren OrderField-Wert oder ein gleiches OrderField mit einem niedrigeren Id-Wert hat. Somit wird effektiv die Zeile mit dem größten OrderField innerhalb jeder Gruppe abgerufen.

Optimierung

Die Verwendung des Left-Outer-Join-Ansatzes kann die Abfrageleistung im Vergleich zur früheren Methode mit @Rank und Unterabfragen erheblich verbessern. Der linke äußere Join kann einen Index für (GroupId, OrderField) für optimierten Zugriff nutzen.

Vorsicht bezüglich @Rank

Der anfängliche Ansatz mit @Rank funktioniert aufgrund der Tatsache möglicherweise nicht wie erwartet @Rank-Inkremente werden fortgesetzt, nachdem die erste Tabelle verarbeitet wurde. Um @Rank zwischen Tabellen auf Null zurückzusetzen, müssten Sie eine zusätzliche abgeleitete Tabelle einführen, was jedoch zu einer schlechten Optimierung führen kann.

Das obige ist der detaillierte Inhalt vonWie kann man in SQL effizient Minimal- und Maximalwerte pro Gruppe finden, ohne Ranking-Funktionen zu 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