首頁 > 資料庫 > mysql教程 > 如何在 MySQL 中僅檢索每組的前 N ​​行?

如何在 MySQL 中僅檢索每組的前 N ​​行?

Susan Sarandon
發布: 2025-01-25 11:57:10
原創
867 人瀏覽過

How to Retrieve Only the Top N Rows per Group in MySQL?

MySQL高效獲取每個分組的前N行數據

問題描述:

在數據庫查詢中,您可能需要為每個數據分組僅檢索前N行數據。例如,您的數據集可能包含按年份和ID分組的多行信息。如果您想顯示每個ID的前五條評分最高的記錄,則需要實現一種方法來將結果限制為所需數量。

解決方案:

在MySQL 8或更高版本中,您可以使用ROW_NUMBER、RANK或DENSE_RANK函數來實現此目的。您選擇的具體函數取決於“前N行”的確切定義以及如何處理並列情況。以下是這些函數生成的結果的細分:

  • ROW_NUMBER: 為每個組內的行分配順序號,從1開始。如果您希望通過為具有相同值的行賦予相同的排名來打破並列,則此函數非常理想。
  • RANK: 為每個組內的行分配排名,並列情況將導致相同的排名。如果您優先考慮不同的排名,則此函數很有用。
  • DENSE_RANK: 與RANK類似,但它分配密集排名,這意味著即使存在並列,排名之間也沒有間隙。當您希望確保後續行具有唯一排名時,此函數適用。

示例:

以下查詢使用ROW_NUMBER函數返回每個ID的前5行,按評分降序排序:

<code class="language-sql">SELECT
    year, id, rate
FROM (
    SELECT
        year, id, rate,
        ROW_NUMBER() OVER (PARTITION BY id ORDER BY rate DESC) AS rank_num
    FROM h
    WHERE year BETWEEN 2000 AND 2009
) AS subquery
WHERE rank_num <= 5;</code>
登入後複製

輸出:

year id rate
2006 p01 8.0
2003 p01 7.4
2008 p01 6.8
2001 p01 5.9
2007 p01 5.3
2001 p02 12.5
2004 p02 12.4
2002 p02 12.2
2003 p02 10.3
2000 p02 8.7

通過使用這些函數,您可以有效地將結果限制為每個分組的前N行,並確保數據的所需排序。

以上是如何在 MySQL 中僅檢索每組的前 N ​​行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板