SQL RANK

摘要:在本教程中,你将学习如何使用 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() 函数对每个分区的行进行操作,并在跨越每个分区边界时重新初始化。

相同列值获得相同排名。当多行共享相同排名时,下一行的排名不是连续的。这类似于奥运会上的奖牌授予,当两名运动员共享金牌时,将不会有银牌。

下列语句 创建一个新表,名为 t插入 一些示例数据

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)

下图显示输出

SQL Rank Function example

正如输出中清楚显示的那样,第二行和第三行共享相同的排名,因为它们具有相同的值。第四行获得排名 4,因为 RANK() 函数跳过了排名 3。

请注意,如果你想要连续排名,则可以使用 DENSE_RANK() 函数。

SQL RANK() 函数示例

我们将使用 示例数据库 中的 employeesdepartments 表进行演示。

Employees & Departments Tables

在结果集上使用 SQL RANK() 函数示例

下列语句按员工的工资对他们进行排名

SELECT 
	first_name, 
	last_name, 
	salary, 
	RANK() OVER (ORDER BY salary) salary_rank
FROM 
	employees;
Code language: SQL (Structured Query Language) (sql)

以下显示部分输出

SQL Rank Function over result set example

在此示例中,我们省略了 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() 函数将排名分配给每个分区的员工。具有相同工资的员工获得相同的排名。

下图说明了公共表表达式的部分结果集

SQL Rank Function CTE

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

下图显示了查询的输出

SQL Rank Function over partition example

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

本教程有帮助吗?