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()。