Abrufen der Top-N-Maximalwerte aus einer MySQL-Tabelle
Eine häufige Aufgabe bei der Datenanalyse besteht darin, die Top-n-Maximalwerte für eine bestimmte Spalte auszuwählen von einem Tisch. Betrachten Sie die folgende Tabelle:
column1 | column2 |
---|---|
1 | foo |
2 | foo |
3 | foo |
4 | foo |
5 | bar |
6 | bar |
7 | bar |
8 | bar |
Problemstellung:
Für einen gegebenen Wert von n rufen Sie die obersten n Maximalwerte für Spalte1 ab, gruppiert nach Spalte2. Im obigen Beispiel wäre für n=2 die gewünschte Ausgabe:
column1 |
---|
3 |
4 |
7 |
8 |
Lösung:
Während ein einfacher Ansatz darin bestehen könnte, die Zeilen nach Spalte2 zu gruppieren Wenn Sie den Maximalwert für jede Gruppe auswählen, wird nur der absolute Maximalwert für jede Gruppe zurückgegeben. Um die Top-n-Werte abzurufen, ist ein fortgeschrittenerer Ansatz erforderlich.
UNION-basierter Ansatz:
Ein Ansatz besteht darin, eine UNION-Klausel zu verwenden, um mehrere Abfragen zu kombinieren Wählen Sie den Maximalwert für eine andere Gruppe. Für n=2 würde die folgende Abfrage ausreichen:
SELECT max(column1) m FROM table t GROUP BY column2 UNION SELECT max(column1) m FROM table t WHERE column1 NOT IN (SELECT max(column1) WHERE column2 = t.column2)
Rangbasierter Ansatz:
Für flexiblere n-Werte kann ein rangbasierter Ansatz verwendet werden beschäftigt. Dabei wird jeder Zeile basierend auf dem Wert von Spalte 1 ein Rang zugewiesen und anschließend die Zeilen mit den ersten n Rängen ausgewählt. Die folgende Abfrage implementiert diesen Ansatz:
SELECT t.* FROM (SELECT grouper, (SELECT val FROM table li WHERE li.grouper = dlo.grouper ORDER BY li.grouper, li.val DESC LIMIT 2,1) AS mid FROM (SELECT DISTINCT grouper FROM table ) dlo ) lo, table t WHERE t.grouper = lo.grouper AND t.val > lo.mid
Ersetzen Sie „grouper“ durch den Namen der Gruppierungsspalte und „val“ durch die Spalte, die die Werte enthält.
Die Unterabfrage innerhalb der Die LIMIT-Klausel definiert den n-ten Rangwert für jede Gruppe. Anschließend werden Zeilen mit Werten ausgewählt, die größer als dieser n-te Rangwert sind.
Schlussfolgerung:
Beide Ansätze bieten effektive Methoden zur Auswahl der obersten n Maximalwerte jeweils aus einer Tabelle mit seinen eigenen Stärken und Grenzen. Der gewerkschaftsbasierte Ansatz ist unkompliziert und robust, während der rangbasierte Ansatz Flexibilität bei der Angabe der Anzahl der abzurufenden Maximalwerte bietet.
Das obige ist der detaillierte Inhalt vonWie ruft man die obersten N-Maximalwerte aus einer MySQL-Tabelle ab, gruppiert nach einer bestimmten Spalte?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!