MySQL的窗口函数是一种特殊类型的函数,可以在窗口上执行操作,而窗口是与当前行相关的一组行。窗口函数能够访问其他与当前行在同一窗口中的行,从而可以进行比如总和、平均值、排名等计算。
MySQL窗口函数可以分为三类:
-
聚合函数:如SUM(), AVG(), MIN(), MAX()等,这些也可以作为普通的聚合函数,但在窗口函数的上下文中,它们不会折叠所有行到一个聚合行,而是为每一行返回一个聚合结果。
-
排名函数:如RANK(), DENSE_RANK(), ROW_NUMBER(), NTILE()等,这些函数主要用于为窗口中的行分配一个排名。
-
值函数:如FIRST_VALUE(), LAST_VALUE(), LEAD(), LAG()等,这些函数用于获取窗口中特定位置的值。
窗口函数的语法如下:
function_name(args) OVER (
[PARTITION BY partition_expression, ... ]
[ORDER BY sort_expression [ASC | DESC], ...]
[window_frame_clause]
)
-
PARTITION BY:用于将结果集划分为多个分区或窗口,每个窗口都是结果集的一个子集,窗口函数将独立于每个窗口运行。
-
ORDER BY:用于在每个窗口内对行进行排序。
-
window_frame_clause:用于定义窗口内的行范围或行间的关系。
例如:
SELECT
name, salary,
AVG(salary) OVER (ORDER BY salary) as running_avg
FROM employee;
这将返回员工的姓名,薪水和截止到当前行的薪水的平均值。
注意:窗口函数不能用于WHERE子句中。