Heim >Datenbank >MySQL-Tutorial >Wie kann ich mit SQLs GROUP BY effizient die Top-N-Elemente für jede Gruppe abrufen?
SQL Group BY: Abrufen der Top-N-Elemente für jede Gruppe
Beim Arbeiten mit Daten in SQL ist es oft notwendig, Datensätze basierend auf zu gruppieren gemeinsame Kriterien und führen Berechnungen oder Aggregationen innerhalb jeder Gruppe durch. Hier kommt die GROUP BY-Klausel ins Spiel. In diesem Artikel wird eine leistungsstarke Technik beschrieben, die GROUP BY mit der Funktion ROW_NUMBER() kombiniert, um die Top-N-Artikel für jede Gruppe in einer einzigen Abfrage effizient abzurufen.
Problem: Meistverkaufte Artikel pro Geschäft
Stellen Sie sich ein Szenario vor, in dem wir eine Sales-Tabelle mit den Spalten UPCCode, SaleDate, StoreId und TotalDollarSales haben. Die Aufgabe besteht darin, die fünf am häufigsten verkauften Artikel in jedem Geschäft zu identifizieren.
Abfrage:
Wir könnten dieses Problem mit mehreren einzelnen Abfragen mithilfe von UNION angehen, aber das ist möglicherweise nicht der Fall effizient sein. Stattdessen nutzt die folgende Abfrage eine Unterabfrage und die Funktion ROW_NUMBER():
WITH s AS ( SELECT StoreID, UPCCode, tds, rn = ROW_NUMBER() OVER (PARTITION BY StoreID ORDER BY tds DESC) FROM ( SELECT StoreID, UPCCode, tds = SUM(TotalDollarSales) FROM Sales GROUP BY StoreID, UPCCode ) AS s2 ) SELECT StoreID, UPCCode, TotalDollarSales = tds FROM s WHERE rn <p><strong>Erklärung:</strong></p><ol> <li>Die verschachtelte Unterabfrage (s2) gruppiert die Verkäufe Daten nach StoreID und UPCCode und berechnet den Gesamtumsatz (tds) für jede Kombination.</li> <li>Das Wichtigste Unterabfrage(n) umschließt s2 und führt die Funktion ROW_NUMBER() ein. Diese Funktion weist jedem Datensatz innerhalb jeder Partition (StoreID) eine fortlaufende Nummer (rn) zu.</li> <li>In der letzten Abfrage filtern wir nach Zeilen, in denen rn kleiner oder gleich 5 ist (d. h. die obersten 5 Datensätze). für jede Partition) und extrahieren Sie StoreID, UPCCode und TotalDollarSales für jede qualifizierte Datei Element.</li> </ol><p><strong>Fazit:</strong></p><p>Mit dieser erweiterten SQL-Abfrage können Sie die Top-N-Elemente für jede Gruppe effizient erfassen und so gängige Datenverarbeitungsszenarien elegant angehen und verbessern Ihre Fähigkeiten zur Abfrageoptimierung.</p>
Das obige ist der detaillierte Inhalt vonWie kann ich mit SQLs GROUP BY effizient die Top-N-Elemente für jede Gruppe abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!