开窗函数是 MySQL 8.0 引入的一个极其强大的功能,它允许你在不压缩原始行的情况下,对一组相关的行(称为“窗口”)进行计算,并为每一行返回一个值。这与 GROUP BY 聚合不同,GROUP BY 会将多行压缩成一行,而开窗函数会保留所有行的细节,同时增加聚合或排名信息。
开窗函数的核心语法是使用 OVER() 子句来定义窗口:
function_name([expression]) OVER (
[PARTITION BY partition_expression, ... ]
[ORDER BY sort_expression [ASC | DESC], ... ]
[frame_clause]
)
- PARTITION BY: 将数据分割成多个分区(类似于
GROUP BY),函数会在每个分区内独立计算。如果省略,整个结果集被视为一个分区。 - ORDER BY: 定义分区内数据的排序方式。对于排名函数是必须的,对于聚合函数则决定了计算的范围框架。
- frame_clause: 定义当前行所在分区中的一个子集(框架),用于聚合函数。语法通常是
ROWS BETWEEN frame_start AND frame_end(例如ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)。
开窗函数主要分为三类:
1. 序号函数
主要用于为行分配一个唯一的序号或排名。
| 函数 | 描述 | 特点 |
|---|---|---|
ROW_NUMBER() |
为分区内的每一行分配一个唯一的连续序号(无论值是否相同)。 | 1, 2, 3, 4, 5 |
RANK() |
为分区内的行分配排名。相同值的行排名相同,但会留下空洞。 | 1, 2, 2, 4, 5 |
DENSE_RANK() |
为分区内的行分配排名。相同值的行排名相同,但排名是连续的。 | 1, 2, 2, 3, 4 |
NTILE(n) |
将分区内的数据尽可能平均地分配到 n 个桶中,并指定当前行所属的桶号。 |
示例:
假设有一个 sales 表,包含 salesperson(销售员)和 amount(销售额)。
SELECT
salesperson,
amount,
ROW_NUMBER

最低0.47元/天 解锁文章
929

被折叠的 条评论
为什么被折叠?



