Maison >base de données >tutoriel mysql >Comment récupérer efficacement les N principaux éléments de chaque groupe à l'aide du GROUP BY de SQL ?

Comment récupérer efficacement les N principaux éléments de chaque groupe à l'aide du GROUP BY de SQL ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-23 12:06:17192parcourir

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

SQL Group BY : récupérer les N principaux éléments pour chaque groupe

Lorsque vous travaillez avec des données dans SQL, il est souvent nécessaire de regrouper les enregistrements en fonction de critères communs et effectuer des calculs ou des agrégations au sein de chaque groupe. C'est là qu'intervient la clause GROUP BY. Cet article présente une technique puissante qui combine GROUP BY avec la fonction ROW_NUMBER() pour récupérer efficacement les N articles les plus vendus pour chaque groupe en une seule requête.

Problème : articles les plus vendus par magasin

Considérons un scénario dans lequel nous avons une table Sales avec les colonnes UPCCode, SaleDate, StoreId et TotalDollarSales. La tâche consiste à identifier les 5 articles les plus vendus dans chaque magasin.

Requête :

Nous pourrions aborder ce problème avec plusieurs requêtes individuelles en utilisant UNION, mais ce n'est peut-être pas le cas. être efficace. Au lieu de cela, la requête suivante exploite une sous-requête et la fonction 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;

Explication :

  1. La sous-requête imbriquée (s2) regroupe les ventes données par StoreID et UPCCode et calcule les ventes totales (tds) pour chaque combinaison.
  2. Le principal la ou les sous-requêtes entourent s2 et introduisent la fonction ROW_NUMBER(). Cette fonction attribue un numéro séquentiel (rn) à chaque enregistrement au sein de chaque partition (StoreID).
  3. Dans la requête finale, nous filtrons les lignes où rn est inférieur ou égal à 5 ​​(c'est-à-dire les 5 premiers enregistrements pour chaque partition) et extrayez le StoreID, l'UPCCode et le TotalDollarSales pour chaque qualifié élément.

Conclusion :

Cette requête SQL avancée vous permet de rassembler efficacement les N principaux éléments de chaque groupe, en abordant avec élégance les scénarios de traitement de données courants et en améliorant vos compétences en optimisation de requêtes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn