MySQL 窗口函数
MySQL窗口函数是一种强大的工具,允许你在查询结果中执行复杂的计算,而无需使用子查询或复杂的连接操作。窗口函数特别适用于需要在结果集中进行分组、排序或累积计算的场景。
什么是窗口函数?
窗口函数是一种特殊的SQL函数,它可以在查询结果的每一行上执行计算,同时保留原始行的上下文。与聚合函数不同,窗口函数不会将多行合并为一行,而是为每一行返回一个值。
窗口函数的基本语法如下:
sql
function_name (expression) OVER (
[PARTITION BY partition_expression]
[ORDER BY sort_expression]
[frame_clause]
)
function_name
:窗口函数的名称,如ROW_NUMBER()
、RANK()
、SUM()
等。expression
:要计算的表达式。PARTITION BY
:将数据分成多个分区,每个分区独立计算。ORDER BY
:指定分区内的排序方式。frame_clause
:定义窗口的范围,通常用于累积计算。
常见的窗口函数
1. ROW_NUMBER()
ROW_NUMBER()
函数为每一行分配一个唯一的序号,序号从1开始。
sql
SELECT
name,
salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
FROM employees;
输出:
name | salary | row_num |
---|---|---|
Alice | 9000 | 1 |
Bob | 8000 | 2 |
Charlie | 7000 | 3 |
2. RANK()
RANK()
函数为每一行分配一个排名,排名相同的行会得到相同的值,后续排名会跳过。
sql
SELECT
name,
salary,
RANK() OVER (ORDER BY salary DESC) AS rank
FROM employees;
输出:
name | salary | rank |
---|---|---|
Alice | 9000 | 1 |
Bob | 8000 | 2 |
Charlie | 7000 | 3 |
3. DENSE_RANK()
DENSE_RANK()
函数与 RANK()
类似,但不会跳过后续排名。
sql
SELECT
name,
salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank
FROM employees;
输出:
name | salary | dense_rank |
---|---|---|
Alice | 9000 | 1 |
Bob | 8000 | 2 |
Charlie | 7000 | 3 |
4. SUM()
SUM()
函数可以用于计算累积和。
sql
SELECT
name,
salary,
SUM(salary) OVER (ORDER BY salary) AS cumulative_salary
FROM employees;
输出:
name | salary | cumulative_salary |
---|---|---|
Charlie | 7000 | 7000 |
Bob | 8000 | 15000 |
Alice | 9000 | 24000 |
实际应用场景
案例1:计算每个部门的工资排名
假设我们有一个 employees
表,包含员工的姓名、部门和工资。我们可以使用窗口函数来计算每个部门内员工的工资排名。
sql
SELECT
name,
department,
salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank
FROM employees;
输出:
name | department | salary | dept_rank |
---|---|---|---|
Alice | Sales | 9000 | 1 |
Bob | Sales | 8000 | 2 |
Charlie | HR | 7000 | 1 |
案例2:计算累积销售额
假设我们有一个 sales
表,包含销售日期和销售额。我们可以使用窗口函数来计算每天的累积销售额。
sql
SELECT
sale_date,
amount,
SUM(amount) OVER (ORDER BY sale_date) AS cumulative_amount
FROM sales;
输出:
sale_date | amount | cumulative_amount |
---|---|---|
2023-01-01 | 100 | 100 |
2023-01-02 | 200 | 300 |
2023-01-03 | 150 | 450 |
总结
MySQL窗口函数为数据分析提供了强大的工具,允许你在查询结果中执行复杂的计算,而无需使用子查询或复杂的连接操作。通过 PARTITION BY
和 ORDER BY
子句,你可以灵活地控制窗口的范围和排序方式。
提示
练习:尝试在你的数据库中创建一个包含员工信息的表,并使用窗口函数计算每个部门的工资排名和累积工资。
附加资源
通过学习和实践,你将能够熟练使用MySQL窗口函数来处理复杂的数据分析任务。