【sql中rownumber和rank区别】在SQL中,`ROW_NUMBER()` 和 `RANK()` 是两个常用的窗口函数,用于对查询结果进行排序和编号。虽然它们的功能相似,但在实际使用中有着明显的区别。以下是对这两个函数的总结与对比。
一、基本功能说明
- ROW_NUMBER():为每一行分配一个唯一的序号,即使有相同的排序值,也会被赋予不同的编号。
- RANK():根据排序值对行进行排名,如果有相同的排序值,它们会获得相同的排名,但下一个排名会跳过重复的数量。
二、主要区别总结
| 特性 | ROW_NUMBER() | RANK() |
| 是否允许重复编号 | 否(每个行都有唯一编号) | 是(相同排序值可获得相同排名) |
| 是否跳过空缺 | 否(连续编号) | 是(如果多个行具有相同排名,下一个排名会跳过) |
| 使用场景 | 需要唯一标识每条记录时 | 需要按顺序排名且允许并列时 |
| 对NULL值的处理 | 通常将NULL视为最小或最大值 | 处理方式取决于数据库系统 |
三、示例说明
假设有一个员工表 `employees`,包含字段 `name` 和 `salary`,数据如下:
| name | salary |
| Alice | 5000 |
| Bob | 6000 |
| Charlie | 6000 |
| David | 7000 |
使用 `ROW_NUMBER()` 查询:
```sql
SELECT name, salary, ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
FROM employees;
```
结果:
| name | salary | row_num |
| David | 7000 | 1 |
| Bob | 6000 | 2 |
| Charlie | 6000 | 3 |
| Alice | 5000 | 4 |
使用 `RANK()` 查询:
```sql
SELECT name, salary, RANK() OVER (ORDER BY salary DESC) AS rank_num
FROM employees;
```
结果:
| name | salary | rank_num |
| David | 7000 | 1 |
| Bob | 6000 | 2 |
| Charlie | 6000 | 2 |
| Alice | 5000 | 4 |
四、适用场景建议
- 如果你需要为每一条记录分配一个唯一的序号,使用 `ROW_NUMBER()`。
- 如果你希望在排序中允许并列排名,例如在竞赛成绩中出现并列名次,使用 `RANK()`。
通过理解 `ROW_NUMBER()` 和 `RANK()` 的区别,可以更灵活地应对各种排序与编号需求,提升SQL查询的实用性与准确性。


