Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


DENSE_RANK

📄字数 2.2K
👁️阅读量 加载中...

功能描述

返回有序行组中一行的排名,并将排名作为数字返回。排名是从 1 开始的连续整数。在并列的情况下,排名值不会被跳过。排名标准值相等的行将获得相同的排名。

此函数应与 ORDER BY 一起使用,以将分区行按所需顺序排序。没有 ORDER BY,所有行都是对等行。

DENSE_RANK 通过排名函数和开窗配合使用返回特定的排名结果。

DENSE_RANK 函数不支持只包括分区的情况。

DENSE_RANK 为无参函数。

语法格式

DENSE_RANK() OVER(analytic_clause)

输入参数

  • analytic_clause:分析子句,支持分组子句,排序子句以及范围子句,其中排序子句是必须项,分析子句的详细说明请参考 analytic_clause

提示

  • 分组子句(PARTITION BY):可选,按列分区(如 deptno),每个分区独立排名。
  • 排序子句(ORDER BY):指定排序项(如 price DESC),决定排名顺序,支持指定多列和排序方向。

输出结果

返回 INTEGER 类型,取值范围为:[1, 分区内唯一排序值的数量],若输入参数为 NULL,则输出结果为 NULL

示例

sql
SQL> CREATE TABLE tab_sal_info(id INT IDENTITY(1,1), name VARCHAR, deptno INT, sal NUMERIC(10,2));

SQL> INSERT INTO tab_sal_info VALUES(DEFAULT, '张三', 10, 5000);
SQL> INSERT INTO tab_sal_info VALUES(DEFAULT, '李四', 10, 5500);
SQL> INSERT INTO tab_sal_info VALUES(DEFAULT, '王五', 10, 4500);
SQL> INSERT INTO tab_sal_info VALUES(DEFAULT, '赵六', 10, 4800);
SQL> INSERT INTO tab_sal_info VALUES(DEFAULT, '陈七', 10, 5500);
SQL> INSERT INTO tab_sal_info VALUES(DEFAULT, '刘八', 20, 3000);
SQL> INSERT INTO tab_sal_info VALUES(DEFAULT, '李九', 20, 3500);
SQL> INSERT INTO tab_sal_info VALUES(DEFAULT, '周十', 20, 3800);
SQL> INSERT INTO tab_sal_info VALUES(DEFAULT, '张一', 20, 2300);
SQL> INSERT INTO tab_sal_info VALUES(DEFAULT, '李二', 20, 3500);
SQL> INSERT INTO tab_sal_info VALUES(DEFAULT, '吴二', 20, 3800);
SQL> INSERT INTO tab_sal_info VALUES(DEFAULT, '张二', 20, 3800);
SQL> INSERT INTO tab_sal_info VALUES(DEFAULT, '刘二', 20, 4000);
SQL> INSERT INTO tab_sal_info VALUES(DEFAULT, '周二', 20, 4300);

-- DENSE_RANK排名
SQL> SELECT *, DENSE_RANK() OVER(PARTITION BY deptno ORDER BY sal) dr FROM tab_sal_info ORDER BY deptno, dr;

+----+------+--------+------+----+
| ID | NAME | DEPTNO | SAL  | DR |
+----+------+--------+------+----+
| 3  | 王五 | 10     | 4500 | 1  |
| 4  | 赵六 | 10     | 4800 | 2  |
| 1  | 张三 | 10     | 5000 | 3  |
| 5  | 陈七 | 10     | 5500 | 4  |
| 2  | 李四 | 10     | 5500 | 4  |
| 9  | 张一 | 20     | 2300 | 1  |
| 6  | 刘八 | 20     | 3000 | 2  |
| 10 | 李二 | 20     | 3500 | 3  |
| 7  | 李九 | 20     | 3500 | 3  |
| 11 | 吴二 | 20     | 3800 | 4  |
| 8  | 周十 | 20     | 3800 | 4  |
| 12 | 张二 | 20     | 3800 | 4  |
| 13 | 刘二 | 20     | 4000 | 5  |
| 14 | 周二 | 20     | 4300 | 6  |
+----+------+--------+------+----+

扩展

  • 为相同值分配相同的排名,且跳过后续排名(非连续排名),请参考函数 RANK()
  • 为相同值分配不同的排名,请参考函数 ROW_NUMBER()