黑马程序员mysql窗口函数over
时间: 2025-01-02 18:29:35 浏览: 11
### MySQL 窗口函数 `OVER` 的使用教程
#### 定义与基本语法
窗口函数通过 `OVER` 子句定义操作的数据窗口。此子句允许指定分区、排序以及框架条件,从而影响函数如何处理数据集中的每一行[^5]。
```sql
window_function (expr) OVER (
[PARTITION BY value_expression, ... ]
[ORDER BY sort_expression [ASC|DESC], ... ]
[frame_clause]
)
```
- **PARTITION BY**: 类似于 SQL 查询语句里的 GROUP BY,用于将查询结果划分为多个逻辑部分,在这些独立的部分内应用窗口函数。
- **ORDER BY**: 对各分区内记录按特定列进行排列;对于某些依赖顺序的窗口功能至关重要。
- **frame_clause**: 可选参数,用来进一步限定参与运算的具体行集合,默认情况下整个分区作为当前行上下文的一部分。
#### 实际应用场景举例说明
##### 计算累计销售额
假设有一个销售表 `sales`,其中包含日期 (`sale_date`) 和金额 (`amount`) 字段:
```sql
SELECT sale_date,
amount,
SUM(amount) OVER (ORDER BY sale_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_sales
FROM sales;
```
上述代码会基于时间先后次序累加每一天发生的交易总额,并将其展示给用户查看[^1]。
##### 获取前一行/后一行数值对比分析
利用LAG() 或 LEAD() 函数可以方便地访问相邻两行之间的差异情况:
```sql
SELECT employee_id,
salary,
LAG(salary, 1) OVER (PARTITION BY department ORDER BY hire_date) as prev_salary,
LEAD(salary, 1) OVER (PARTITION BY department ORDER BY hire_date) as next_salary
FROM employees;
```
这段脚本能够帮助我们比较同一部门内部员工入职前后薪资变化趋势[^3]。
##### 平均成绩排名统计
当面对学生成绩单时,可能希望知道每位同学在其所在班级里所处位置:
```sql
SELECT student_name,
score,
AVG(score) OVER () avg_score,
RANK() OVER (PARTITION BY class_id ORDER BY score DESC) rank_in_class
FROM scores;
```
这里不仅给出了个人得分还附带了平均线及名次信息以便更直观理解个体表现状况[^2]。
阅读全文