MySQL窗口函数(Window Functions),也称为窗口聚合函数或OLAP(Online Analytical Processing)函数,是一种特殊的函数,用于执行窗口聚合操作。这些函数能够对数据集的子集(称为窗口)执行计算,而不会将行合并成单个输出行,这与传统的聚合函数不同。
窗口函数通常与OVER()
子句一起使用,以定义窗口的规则。OVER()
子句可以指定分区方式、排序方式以及窗口的框架(如行的范围)。
以下是一些常用的MySQL窗口函数:
-
聚合函数:
ROW_NUMBER()
:为每个窗口内的行分配一个唯一的连续整数。RANK()
:为每个窗口内的行分配一个排名,相同值的行会有相同的排名,排名之间会有间隔。DENSE_RANK()
:与RANK()
类似,但排名之间不会有间隔。LEAD()
:返回当前行的下一行的值。LAG()
:返回当前行的上一行的值。SUM()
:计算窗口内所有行的总和。AVG()
:计算窗口内所有行的平均值。MIN()
和MAX()
:分别计算窗口内的最小值和最大值。
-
非聚合函数:
FIRST_VALUE()
:返回窗口内的第一行的值。LAST_VALUE()
:返回窗口内的最后一行的值。
窗口函数的语法通常如下:
SELECT
column_name,
window_function_name(another_column_name)
OVER (PARTITION BY column_name ORDER BY column_name [ROWS | RANGE frame_clause])
FROM
table_name;
PARTITION BY
:指定如何对数据进行分区,类似于GROUP BY
。ORDER BY
:指定窗口内的排序方式。ROWS
或RANGE
:定义窗口的框架类型。ROWS
:基于行的相对位置。RANGE
:基于行值的范围。
例如,以下SQL语句使用ROW_NUMBER()
为每个部门的员工分配一个唯一的行号,并且按照工资降序排列:
SELECT
department_id,
employee_id,
salary,
ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS row_num
FROM
employees;
在这个例子中,每个部门的员工将根据他们的工资降序获得一个行号,部门内工资最高的员工将获得行号1。
窗口函数在处理复杂的数据分析任务时非常有用,如计算移动平均值、排名、差异等。