简介:在本教程中,你将学习如何使用 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() 函数示例
我们将在样本数据库中使用 employees
和 departments
表作为示例进行演示。

使用 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() 遍历分区示例
以下语句按员工所在部门的工资对其进行排名
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()
函数应用于每个分区,以根据工资顺序分配行排名。
下图显示了该查询的部分输出结果

要仅查找在其部门中工资最高的员工,你只需在 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()
函数对具有无空隙排名值的范围内进行行排名。
本教程是否有帮助 ?