使用窗口函数获取每个分组的前 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中文网其他相关文章!