SQL DENSE_RANK

简介:在本教程中,你将学习如何使用 SQL DENSE_RANK() 函数对具有无空隙排名值的范围内进行行排名。

SQL DENSE_RANK() 函数概述

DENSE_RANK() 是一款窗口函数,用于给定分区内的行分配排行,并且排名值中无空隙。

如果每个分区中两行或更多行具有相同的值,则这些行会收到相同的排名。下一行的排名则增加 1。

不同于 RANK() 函数,DENSE_RANK() 函数始终会生成连续的排名值。

DENSE_RANK() 函数的语法如下

DENSE_RANK() OVER (
	PARTITION BY expr1[{,expr2...}]
	ORDER BY expr1 [ASC|DESC], [{,expr2...}]
)
Code language: SQL (Structured Query Language) (sql)

在此语法中

  • 首先,PARTITION BY 子句将 FROM 子句生成的结果集划分为几个分区。
  • 然后,ORDER BY 指定每个分区中行的顺序。
  • 最后,DENSE_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)

以下语句同时使用 DENSE_RANK()RANK() 函数,以便给结果集的每一行分配排名

SELECT
	col,
	DENSE_RANK() OVER (
		ORDER BY col
	) my_dense_rank,
	RANK() OVER (
		ORDER BY col
	) my_rank
FROM
	t;
Code language: SQL (Structured Query Language) (sql)

以下是输出

SQL DENSE_RANK Function example

SQL DENSE_RANK() 函数示例

我们将在样本数据库中使用 employeesdepartments 表作为示例进行演示。

Employees & Departments Tables

使用 SQL DENSE_RANK() 遍历结果集示例

以下语句使用 DENSE_RANK() 函数按员工的工资对其进行排名

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

在此示例中,我们省略了 PARTITION BY 子句,因此 DENSE_RANK() 函数将整个结果集合视为一个单独的分区。

首先,ORDER BY 子句按降序对工资进行了排序。然后,DENSE_RANK() 函数通过员工的工资金额分配每个员工的排名。

下图显示了该查询的部分输出结果

SQL DENSE_RANK Function Over Result Set example

使用 SQL DENSE_RANK() 遍历分区示例

以下语句按员工所在部门的工资对其进行排名

SELECT 
	first_name, 
	last_name, 
	department_name,
	salary, 
	DENSE_RANK() OVER (
		PARTITION BY department_name
		ORDER BY salary DESC) salary_rank
FROM 
	employees e
	INNER JOIN departments d 
		ON d.department_id = e.department_id;
Code language: SQL (Structured Query Language) (sql)

在此示例中

  • 首先,PARTITION BY 子句按部门名称将员工划分为几个分区。
  • 然后,ORDER BY 子句按每个部门(分区)的工资对员工进行排序。
  • 最后,将 DENSE_RANK() 函数应用于每个分区,以根据工资顺序分配行排名。

下图显示了该查询的部分输出结果

SQL DENSE_RANK Function Over Partition example

要仅查找在其部门中工资最高的员工,你只需在 FROM 子句中使用以下 子查询

SELECT 
	* 
FROM (
	SELECT 
		first_name, 
		last_name, 
		department_name,
		salary, 
		DENSE_RANK() OVER (
			PARTITION BY department_name
			ORDER BY salary DESC) salary_rank
	FROM 
		employees e
		INNER JOIN departments d 
			ON d.department_id = e.department_id
	) t
WHERE 
	salary_rank = 1;Code language: SQL (Structured Query Language) (sql)

以下输出显示了在其所在部门中工资最高的员工

SQL DENSE_RANK Function find nth highest value

在本教程中,你已学习如何使用 SQL DENSE_RANK() 函数对具有无空隙排名值的范围内进行行排名。

本教程是否有帮助 ?