首頁 > 資料庫 > mysql教程 > 如何使用窗口函數在SQL中為每個組的每個組檢索頂部N行?

如何使用窗口函數在SQL中為每個組的每個組檢索頂部N行?

Susan Sarandon
發布: 2025-01-25 11:51:37
原創
671 人瀏覽過

How Can I Retrieve the Top N Rows for Each Group in SQL Using Window Functions?

使用視窗函數取得每個分組的前 N ​​行

本文介紹如何使用 SQL 視窗函數有效率地從分組資料中提取前 N 行。 這在許多數據分析場景中非常實用。

MySQL 8 及更高版本提供了三個常用的視窗函數:ROW_NUMBERRANKDENSE_RANK。這些函數為每行分配一個數值,從而方便我們選擇每個分組中的前幾行。

範例資料:

假設我們有以下資料集:

pkid catid value
1 p01 100
2 p01 90
3 p01 90
4 p01 80
5 p01 80
6 p01 80
7 p01 70
8 p01 60
9 p01 50
10 p01 40

三個視窗函數的輸出結果比較:

pkid catid value row_number rank dense_rank
1 p01 100 1 1 1
2 p01 90 2 2 2
3 p01 90 3 2 2
4 p01 80 4 4 3
5 p01 80 5 4 3
6 p01 80 6 4 3
7 p01 70 7 7 4
8 p01 60 8 8 5
9 p01 50 9 9 6
10 p01 40 10 10 7

函數說明:

  • ROW_NUMBER: 為每個分組中的每一行分配一個唯一的順序編號,從 1 開始。例如,catidp01 的前 5 行的 row_number 值為 1 到 5。

  • RANK: 為每個分組中的每一行分配一個排名,相同值的行的排名相同。例如,catidp01 的前 5 行的 rank 值為 1 到 5(即使有些值重複)。

  • DENSE_RANK: 類似於 RANK,但相同值的行的排名是連續的,沒有間隙。例如,catidp01 的前 5 行的 dense_rank 值為 1 到 5(即使有些值重複)。

選擇適當的視窗函數:

選擇哪個視窗函數取決於你的特定需求以及對「前 N 行」的定義。 如果你需要每行都有唯一的排名,使用 ROW_NUMBER;如果你允許相同值的行的排名相同,使用 RANK;如果你需要連續的排名,則使用 DENSE_RANK

以上是如何使用窗口函數在SQL中為每個組的每個組檢索頂部N行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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