mysql窗口函数 范围
时间: 2025-06-19 19:56:36 浏览: 15
### MySQL 窗口函数的使用范围和语法
窗口函数是 MySQL 中用于复杂数据分析的强大工具,其主要作用是在不分组的情况下对查询结果中的数据进行计算。与传统的 `GROUP BY` 聚合不同,窗口函数保留了每一行的细节,同时为每一行计算聚合值或排名等信息[^4]。
#### 使用范围
窗口函数适用于需要对数据进行复杂统计分析的场景,例如:
- **移动平均**:计算一段时间内的平均值。
- **累计总和**:计算某个字段的累积值。
- **排名分析**:为每组数据分配排名。
- **百分比分布**:计算某一行在整个窗口中的比例。
- **偏移比较**:对比当前行与其他行(如前一行或后一行)的值。
这些功能在财务分析、销售报表生成、用户行为分析等领域非常常见[^3]。
#### 语法结构
窗口函数的基本语法如下:
```sql
SELECT column1, AGGREGATE_FUNCTION(column2) OVER (
PARTITION BY column3
ORDER BY column4
[FRAME_CLAUSE]
) FROM table_name;
```
- **`AGGREGATE_FUNCTION`**:可以是聚合函数(如 `SUM`、`AVG`、`MAX`、`MIN` 等),也可以是专用的窗口函数(如 `ROW_NUMBER`、`RANK`、`DENSE_RANK` 等)。
- **`PARTITION BY`**:定义窗口的分区,类似于 `GROUP BY`,但不会减少行数。
- **`ORDER BY`**:定义窗口内行的排序规则。
- **`FRAME_CLAUSE`**:可选,用于进一步定义窗口框架的范围,例如滑动窗口。
#### 示例
以下是一些常见的窗口函数示例:
1. **计算每个部门的累计工资**
```sql
SELECT
department_id,
employee_id,
salary,
SUM(salary) OVER (PARTITION BY department_id ORDER BY employee_id) AS cumulative_salary
FROM employees;
```
这段代码为每个部门的员工按 `employee_id` 排序,并计算累计工资[^2]。
2. **为每个部门的员工按工资排名**
```sql
SELECT
department_id,
employee_id,
salary,
RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank
FROM employees;
```
这段代码为每个部门的员工按工资从高到低排名[^2]。
3. **比较员工的当前工资与前一个月的工资**
```sql
SELECT
employee_id,
salary,
LAG(salary, 1) OVER (PARTITION BY employee_id ORDER BY month) AS prev_month_salary,
salary - LAG(salary, 1) OVER (PARTITION BY employee_id ORDER BY month) AS salary_diff
FROM salaries;
```
这段代码通过 `LAG` 函数获取上一个月的工资,并计算差值。
4. **计算最近3个月的移动平均工资**
```sql
SELECT
employee_id,
month,
salary,
AVG(salary) OVER (
PARTITION BY employee_id
ORDER BY month
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
) AS moving_avg_salary
FROM salaries;
```
这段代码通过窗口框架定义了最近3个月的滑动窗口,并计算移动平均工资[^2]。
#### 注意事项
- 窗口函数不能直接用于 `WHERE` 子句中,因为它们是在查询结果生成后计算的。
- 如果需要基于窗口函数的结果过滤数据,可以使用子查询或公用表表达式(CTE)。
---
阅读全文
相关推荐


















