mysql 窗口函数(Window Functions)详解
mysql 窗口函数(Window Functions)详解
窗口函数是 SQL 中的一种强大工具,它允许你在不改变原始表行数的情况下对数据进行聚合计算。与传统的 GROUP BY
不同,窗口函数不会将多行合并为一行,而是可以在每一行上应用聚合操作,同时保留原始的行结构。这使得窗口函数非常适合用于复杂的分析任务,例如:
- 移动平均:计算某个时间段内的平均值。
- 排名:为每行数据分配一个排名。
- 累计和:计算到当前行为止的累计总和。
- 前后行比较:比较当前行与前几行或后几行的数据。
1. 窗口函数的基本语法
窗口函数的通用语法如下:
window_function(expression) OVER (
[PARTITION BY partition_expression]
[ORDER BY order_expression]
[frame_clause]
)
window_function
:这是你想要应用的聚合函数或排名函数,例如SUM()
、AVG()
、ROW_NUMBER()
、RANK()
等。expression
:要应用于窗口函数的列或表达式。OVER
:指定窗口的范围,告诉 SQL 引擎如何划分数据并应用窗口函数。PARTITION BY
:可选。类似于GROUP BY
,但它不会减少行数。它将数据划分为多个分区(或“窗口”),并在每个分区内独立应用窗口函数。ORDER BY
:可选。指定窗口内数据的排序顺序。这对于需要按顺序处理的函数(如ROW_NUMBER()
或LAG()
)非常重要。frame_clause
:可选。定义窗口的“框架”,即窗口函数作用的行范围。你可以指定从当前行向前或向后扩展的行数。
2. 窗口函数与 GROUP BY
的区别
-
GROUP BY
:将多行合并为一行,并对每一组数据进行聚合计算。结果集中的行数会减少。SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department;
- 这条查询会返回每个部门的平均工资,结果集中每一行代表一个部门。
-
窗口函数:在每一行上应用聚合计算,但不会减少行数。结果集中的行数与原始表相同,只是每一行都包含了一个新的聚合值。
SELECT id, name, department, salary, AVG(salary) OVER (PARTITION