首页 >数据库 >mysql教程 >如何使用SQL的GROUP BY高效检索每个组的前N项?

如何使用SQL的GROUP BY高效检索每个组的前N项?

Barbara Streisand
Barbara Streisand原创
2024-12-23 12:06:17198浏览

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

SQL Group BY:为每个组获取前 N 个项目

在 SQL 中处理数据时,通常需要根据以下条件对记录进行分组共同标准并在每个组内执行计算或聚合。这就是 GROUP BY 子句发挥作用的地方。本文讨论了一种强大的技术,它将 GROUP BY 与 ROW_NUMBER() 函数相结合,以在单个查询中高效地检索每个组的前 N ​​个商品。

问题:每个商店最畅销的商品

考虑一个场景,其中我们有一个 Sales 表,其中包含 UPCCode、SaleDate、StoreId 和列总销售额。任务是确定每个商店中销量最高的 5 件商品。

查询:

我们可以使用 UNION 通过多个单独的查询来解决这个问题,但这可能不会要有效率。相反,以下查询利用子查询和 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;

解释:

  1. 嵌套子查询 (s2) 对 Sales 进行分组按 StoreID 和 UPCCode 计算数据并计算每个的总销售额 (tds)
  2. 主子查询围绕 s2 并引入 ROW_NUMBER() 函数。该函数为每个分区 (StoreID) 中的每条记录分配一个序号 (rn)。
  3. 在最终查询中,我们过滤 rn 小于或等于 5 的行(即前 5 条记录)对于每个分区)并提取每个合格的 StoreID、UPCCode 和 TotalDollarSales

结论:

这个高级 SQL 查询允许您有效地收集每个组的前 N ​​个项目,优雅地处理常见的数据处理场景并增强您的查询优化技能。

以上是如何使用SQL的GROUP BY高效检索每个组的前N项?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn