rank() over 函数
时间: 2025-03-22 12:12:29 浏览: 15
SQL 中 RANK() OVER()
函数的用法
RANK() OVER()
是一种窗口函数,广泛应用于数据库管理系统(如 SQL Server 和 Oracle),用于为查询结果集中的每一行分配排名。以下是关于其功能和使用的详细介绍:
1. 基本语法
RANK()
的基本语法如下:
RANK() OVER ([PARTITION BY column_name] ORDER BY column_name [ASC | DESC])
PARTITION BY
: 可选参数,用于将数据划分为多个逻辑分组,在每个分组内独立计算排名[^4]。ORDER BY
: 必需参数,指定按哪个列进行排序以及排序的方向(升序[ASC]
或降序[DESC]
)。如果没有提供方向,默认为升序。
2. 功能特点
- 当存在相同值时,
RANK()
会给这些记录分配相同的排名,并且会跳过后续的排名编号。例如,如果有两条记录并列为第 1 名,则下一条记录会被标记为第 3 名,而不会有第 2 名[^1]。
3. 实际应用案例
假设有一个名为 Employees
的表,其中包含员工姓名 (Name
)、部门 (Department
) 和工资 (Salary
) 字段。我们希望根据薪资水平对各部门内部的员工进行排名。
查询语句
SELECT
Name,
Department,
Salary,
RANK() OVER (PARTITION BY Department ORDER BY Salary DESC) AS Rank_Salary
FROM Employees;
- 解释:
- 使用
PARTITION BY Department
将数据按部门划分成若干子集。 - 对于每一个部门,通过
ORDER BY Salary DESC
按照薪水从高到低排列。 - 结果集中新增一列
Rank_Salary
表示每名员工在其所在部门内的薪资排名。
- 使用
4. 示例输出
假设有以下原始数据:
Name | Department | Salary |
---|---|---|
Alice | HR | 7000 |
Bob | IT | 9000 |
Charlie | IT | 8500 |
Diana | HR | 7000 |
执行上述查询后得到的结果可能是这样的:
Name | Department | Salary | Rank_Salary |
---|---|---|---|
Alice | HR | 7000 | 1 |
Diana | HR | 7000 | 1 |
Bob | IT | 9000 | 1 |
Charlie | IT | 8500 | 2 |
注意:由于 Alice 和 Diana 薪资相等,因此它们共享排名第 1;HR 部门中没有其他更高或更低薪金的人,所以不存在进一步的排名变化。
5. 与其他排名函数的区别
除了 RANK()
外,还有两种常见的排名函数——DENSE_RANK()
和 ROW_NUMBER()
。三者的主要差异在于对待重复值的方式上:
- 如果两行具有相同的值,
RANK()
会产生跳跃式的排名; DENSE_RANK()
同样给予相同值一致的排名,但它不会遗漏任何整数作为下一个可能的等级[^2];ROW_NUMBER()
总是返回唯一的连续数值列表,即使某些条目之间可能存在平局情况也不会改变这一特性。
相关推荐



















