使用視窗函數取得每個分組的前 N 行
本文介紹如何使用 SQL 視窗函數有效率地從分組資料中提取前 N 行。 這在許多數據分析場景中非常實用。
MySQL 8 及更高版本提供了三個常用的視窗函數:ROW_NUMBER
、RANK
和 DENSE_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 開始。例如,catid
為 p01
的前 5 行的 row_number
值為 1 到 5。
RANK
: 為每個分組中的每一行分配一個排名,相同值的行的排名相同。例如,catid
為 p01
的前 5 行的 rank
值為 1 到 5(即使有些值重複)。
DENSE_RANK
: 類似於 RANK
,但相同值的行的排名是連續的,沒有間隙。例如,catid
為 p01
的前 5 行的 dense_rank
值為 1 到 5(即使有些值重複)。
選擇適當的視窗函數:
選擇哪個視窗函數取決於你的特定需求以及對「前 N 行」的定義。 如果你需要每行都有唯一的排名,使用 ROW_NUMBER
;如果你允許相同值的行的排名相同,使用 RANK
;如果你需要連續的排名,則使用 DENSE_RANK
。
以上是如何使用窗口函數在SQL中為每個組的每個組檢索頂部N行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!