Heim > Datenbank > MySQL-Tutorial > Wie kann ich mit SQLs GROUP BY effizient die Top-N-Elemente für jede Gruppe abrufen?

Wie kann ich mit SQLs GROUP BY effizient die Top-N-Elemente für jede Gruppe abrufen?

Barbara Streisand
Freigeben: 2024-12-23 12:06:17
Original
183 Leute haben es durchsucht

How to Efficiently Retrieve the Top N Items for Each Group Using SQL's GROUP BY?

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 <= 5
ORDER BY StoreID, TotalDollarSales DESC;
Nach dem Login kopieren

Erklärung:

  1. Die verschachtelte Unterabfrage (s2) gruppiert die Verkäufe Daten nach StoreID und UPCCode und berechnet den Gesamtumsatz (tds) für jede Kombination.
  2. 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.
  3. 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.

Fazit:

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.

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage