数据库中rank函数究竟如何正确应用与操作?详解实用技巧
- 数据库
- 2025-11-17
- 5
在数据库中,RANK() 函数是一个非常实用的聚合函数,它能够为查询结果中的行分配一个排名,这个排名是基于某个特定列的值来确定的,并且可以处理并列排名的情况,以下是如何使用 RANK() 函数的详细说明。
RANK() 函数的基本用法
RANK() 函数的基本语法如下:
RANK() OVER (ORDER BY 列名 [ASC | DESC])
这里,ORDER BY 子句用于指定用于排名的列,以及排序的方向(升序或降序)。RANK() 函数将为每个不重复的值分配一个唯一的排名,并列的值会获得相同的排名。
使用 RANK() 函数的示例
假设我们有一个名为 employees 的表,其中包含 name(员工姓名)和 salary(员工薪资)两列,我们想要根据薪资为员工排名。
SELECT name, salary, RANK() OVER (ORDER BY salary DESC) AS rank FROM employees;
这个查询将返回每个员工的姓名、薪资和排名,薪资最高的员工将获得排名 1,薪资相同的员工将共享相同的排名。

处理并列排名
如果存在薪资相同的员工,RANK() 函数会为这些员工分配相同的排名,并且下一个排名会跳过这些并列排名的数目。
SELECT name, salary, RANK() OVER (ORDER BY salary DESC) AS rank FROM employees WHERE salary > 50000;
在这个例子中,如果两个员工的薪资都是 60000,那么他们的排名将是 1 和 2,而下一个薪资高于 60000 的员工的排名将是 4。
使用 DENSE_RANK() 函数
与 RANK() 函数类似,DENSE_RANK() 函数也是用于排名,但它不会跳过并列排名的数目,这意味着,如果两个员工并列排名,下一个排名将直接是并列排名数目的总和。

在这个例子中,如果两个员工的薪资都是 60000,他们的排名将是 1 和 2,而下一个薪资高于 60000 的员工的排名将是 3。
使用 ROW_NUMBER() 函数
ROW_NUMBER() 函数与 RANK() 和 DENSE_RANK() 不同,它会为查询结果中的每一行分配一个唯一的行号,无论是否有并列值。
SELECT name, salary, ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_number FROM employees WHERE salary > 50000;
在这个例子中,即使两个员工的薪资相同,他们也会获得不同的行号。
表格示例
以下是一个使用 RANK() 函数的表格示例:

| name | salary | rank |
|---|---|---|
| John | 80000 | 1 |
| Jane | 60000 | 2 |
| Jim | 60000 | 2 |
| Bob | 50000 | 4 |
在这个例子中,John 获得了第一名,而 Jane 和 Jim 虽然薪资相同,但因为他们是并列的,所以他们的排名是 2,Bob 因为薪资低于 Jane 和 Jim,所以排名是 4。
FAQs
Q1: RANK() 和 DENSE_RANK() 有什么区别?
A1: RANK() 函数在遇到并列排名时会跳过后续的排名,而 DENSE_RANK() 函数则不会跳过后续的排名,它会直接给予下一个排名。
Q2: 如果我想根据多个列进行排名,应该如何使用 RANK() 函数?
A2: 如果你想根据多个列进行排名,可以在 ORDER BY 子句中指定多个列,并用逗号分隔。
SELECT name, salary, department, RANK() OVER (ORDER BY salary DESC, department ASC) AS rank FROM employees;
在这个例子中,如果两个员工的薪资相同,那么它们的排名将基于 department 列的升序排列来确定。