首頁 >資料庫 >mysql教程 >如何使用SQL的GROUP BY高效率檢索每個群組的前N項?

如何使用SQL的GROUP BY高效率檢索每個群組的前N項?

Barbara Streisand
Barbara Streisand原創
2024-12-23 12:06:17194瀏覽

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