mysql窗口函数使用
时间: 2025-01-16 19:10:33 浏览: 42
### 如何在 MySQL 中使用窗口函数
#### 使用 `ROW_NUMBER()` 函数
`ROW_NUMBER()` 是一种常见的窗口函数,它为每一行分配唯一的连续编号。此功能对于创建有序列表特别有用。
```sql
SELECT
employee_id,
department_id,
salary,
ROW_NUMBER() OVER (
PARTITION BY department_id ORDER BY salary DESC
) AS row_num
FROM employees;
```
上述 SQL 查询会按照部门划分员工,并按工资降序排列给定唯一编号[^1]。
#### 结合其他特性使用的窗口函数
为了增强数据分析能力,在实际应用场景下,窗口函数经常和其他 SQL 特性一起工作来解决更为复杂的问题。比如下面的例子展示了如何利用窗口函数配合子查询完成更高级的数据操作:
```sql
WITH ranked_salaries AS (
SELECT
e.employee_id,
e.department_id,
e.salary,
RANK() OVER (PARTITION BY e.department_id ORDER BY e.salary DESC) as rank
FROM employees e
)
SELECT * FROM ranked_salaries WHERE rank <= 3;
```
这段代码实现了获取各部门薪资排名前三名的人员名单的功能[^2]。
#### 序号类窗口函数的区别与应用
MySQL 提供了几种不同的序号类型的窗口函数,包括但不限于 `ROW_NUMBER()`、`RANK()` 和 `DENSE_RANK()`。这些函数的主要区别在于当遇到相同值时产生的序列不同:
- `ROW_NUMBER()` 总是给出独一无二且连续增加的数值;
- `RANK()` 对于相同的值赋予同样的等级,但是下一个可用号码跳跃着继续下去;
- `DENSE_RANK()` 类似于 `RANK()` 的行为模式,不过不会跳过任何整数。
以下是展示这三种方式差异的一个例子:
```sql
SELECT
score,
ROW_NUMBER() OVER(ORDER BY score DESC),
RANK() OVER(ORDER BY score DESC),
DENSE_RANK() OVER(ORDER BY score DESC)
FROM scores;
```
该命令将根据分数高低对记录进行排序,并分别显示每条记录对应的三个不同类型排位情况[^4]。
阅读全文
相关推荐

















