跳到主要内容

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;

输出:

namesalaryrow_num
Alice90001
Bob80002
Charlie70003

2. RANK()

RANK() 函数为每一行分配一个排名,排名相同的行会得到相同的值,后续排名会跳过。

sql
SELECT 
name,
salary,
RANK() OVER (ORDER BY salary DESC) AS rank
FROM employees;

输出:

namesalaryrank
Alice90001
Bob80002
Charlie70003

3. DENSE_RANK()

DENSE_RANK() 函数与 RANK() 类似,但不会跳过后续排名。

sql
SELECT 
name,
salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank
FROM employees;

输出:

namesalarydense_rank
Alice90001
Bob80002
Charlie70003

4. SUM()

SUM() 函数可以用于计算累积和。

sql
SELECT 
name,
salary,
SUM(salary) OVER (ORDER BY salary) AS cumulative_salary
FROM employees;

输出:

namesalarycumulative_salary
Charlie70007000
Bob800015000
Alice900024000

实际应用场景

案例1:计算每个部门的工资排名

假设我们有一个 employees 表,包含员工的姓名、部门和工资。我们可以使用窗口函数来计算每个部门内员工的工资排名。

sql
SELECT 
name,
department,
salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank
FROM employees;

输出:

namedepartmentsalarydept_rank
AliceSales90001
BobSales80002
CharlieHR70001

案例2:计算累积销售额

假设我们有一个 sales 表,包含销售日期和销售额。我们可以使用窗口函数来计算每天的累积销售额。

sql
SELECT 
sale_date,
amount,
SUM(amount) OVER (ORDER BY sale_date) AS cumulative_amount
FROM sales;

输出:

sale_dateamountcumulative_amount
2023-01-01100100
2023-01-02200300
2023-01-03150450

总结

MySQL窗口函数为数据分析提供了强大的工具,允许你在查询结果中执行复杂的计算,而无需使用子查询或复杂的连接操作。通过 PARTITION BYORDER BY 子句,你可以灵活地控制窗口的范围和排序方式。

提示

练习:尝试在你的数据库中创建一个包含员工信息的表,并使用窗口函数计算每个部门的工资排名和累积工资。

附加资源

通过学习和实践,你将能够熟练使用MySQL窗口函数来处理复杂的数据分析任务。