摘要:在本教程中,你将学习如何使用 SQL RANK()
函数查找结果集中每行的排名。
MySQL RANK() 函数简介
RANK()
函数是一个 窗口函数,它为结果集分区中的每行分配一个排名。
行的排名是由其前面排名的数量加一决定的。
RANK()
函数的语法如下
RANK() OVER (
PARTITION BY <expr1>[{,<expr2>...}]
ORDER BY <expr1> [ASC|DESC], [{,<expr2>...}]
)
Code language: SQL (Structured Query Language) (sql)
在此语法中
- 首先,
PARTITION BY
子句按一条或多条准则将结果集中行分布到分区中。 - 其次,
ORDER BY
子句对每个分区中的行排序。 RANK()
函数对每个分区的行进行操作,并在跨越每个分区边界时重新初始化。
相同列值获得相同排名。当多行共享相同排名时,下一行的排名不是连续的。这类似于奥运会上的奖牌授予,当两名运动员共享金牌时,将不会有银牌。
CREATE TABLE t (
col CHAR
);
INSERT INTO t(col)
VALUES('A'),('B'),('B'),('C'),('D'),('D'),('E');
SELECT
*
FROM
t;
Code language: SQL (Structured Query Language) (sql)
下列语句使用 RANK()
函数为结果集的行分配排名
SELECT
col,
RANK() OVER (
ORDER BY col
) myrank
FROM
t;
Code language: SQL (Structured Query Language) (sql)
下图显示输出

正如输出中清楚显示的那样,第二行和第三行共享相同的排名,因为它们具有相同的值。第四行获得排名 4,因为 RANK()
函数跳过了排名 3。
请注意,如果你想要连续排名,则可以使用 DENSE_RANK()
函数。
SQL RANK() 函数示例
我们将使用 示例数据库 中的 employees
和 departments
表进行演示。

在结果集上使用 SQL RANK() 函数示例
下列语句按员工的工资对他们进行排名
SELECT
first_name,
last_name,
salary,
RANK() OVER (ORDER BY salary) salary_rank
FROM
employees;
Code language: SQL (Structured Query Language) (sql)
以下显示部分输出

在此示例中,我们省略了 PARTITION BY
子句,因此整个结果集被视为单个分区。
ORDER BY
子句按工资对结果中的行排序。然后,将 RANK()
函数应用到结果中的每行,考虑按工资降序对员工进行排序。
在分区上使用 SQL RANK() 函数示例
下列语句查找所在部门内薪水排第二的员工
WITH payroll AS (
SELECT
first_name,
last_name,
department_id,
salary,
RANK() OVER (
PARTITION BY department_id
ORDER BY salary) salary_rank
FROM
employees
)
SELECT
first_name,
last_name,
department_name,
salary
FROM
payroll p
INNER JOIN departments d
ON d.department_id = p.department_id
WHERE
salary_rank = 2;
Code language: SQL (Structured Query Language) (sql)
在公共表表达式中,我们按部门查找员工的工资排名
- 首先,
PARTITION BY
子句按部门将员工记录分隔成分区。 - 然后,
ORDER BY
子句按工资对每个分区中的员工排序。 - 最后,
RANK()
函数将排名分配给每个分区的员工。具有相同工资的员工获得相同的排名。
下图说明了公共表表达式的部分结果集

外部查询仅联接了工资排名为 2 的员工。也已与 departments
表联接,以在最终结果集中返回部门名称。
下图显示了查询的输出

在本教程中,您已了解如何使用 SQL RANK()
函数,该函数为结果集中的每行分配一个排名。
本教程有帮助吗?