effizient maximale Werte und zugehörige Daten in großen SQL -Tabellen finden
Oft erfordern Datenbankabfragen den maximalen Wert in einer Spalte und das Abrufen der entsprechenden Daten aus anderen Spalten in derselben Zeile. Dies ist besonders schwierig bei sehr großen Datensätzen. Betrachten Sie eine Tabelle, die die höchste Versionsnummer für jede eindeutige ID zusammen mit ihrem zugehörigen Tag finden muss:
Beispieltabelle:
ID | tag | version
----- ----- -----
1 | A | 10
2 | A | 20
3 | B | 99
4 | C | 30
5 | F | 40
gewünschtes Ergebnis:
ID | tag | version
----- ----- -----
2 | A | 20
3 | B | 99
4 | C | 30
5 | F | 40
Für Tabellen mit rund 28 Millionen Zeilen, Standardmethoden wie nested select
Aussagen oder einfach gruppe von
mit max
können unglaublich langsam sein. Eine viel effizientere Lösung verwendet die Fensterfunktion row_number ()
:
SELECT s.id, s.tag, s.version
FROM (
SELECT t.*,
ROW_NUMBER() OVER(PARTITION BY t.id ORDER BY t.version DESC) AS rnk
FROM YourTable t
) s
WHERE s.rnk = 1;
Diese Abfrage funktioniert in zwei Schritten:
innere Abfrage: Es weist jeder Zeile in jeder id
partition (Gruppe von Zeilen mit derselben ID) einen eindeutigen Rang ( rnk
). Das Ranking basiert auf der Spalte Version
in absteigender Reihenfolge, was bedeutet, dass die höchste Version Rang erhält 1.
äußere Abfrage: Es filtert die Ergebnisse aus der inneren Abfrage und wählt nur die Zeilen aus, wo rnk = 1
. Dies gibt uns effektiv die Zeile mit der Maximum Version
für jeden id
.
Dieser Ansatz vermeidet verschachtelte Abfragen und Gruppe von
Operationen, wodurch es für große Datensätze erheblich schneller wird. Die Verwendung von row_number ()
bietet eine saubere und effiziente Möglichkeit, das gewünschte Ergebnis zu erzielen.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3