DENSE_RANK [analytic]
在每个窗口分区内,按窗口的 ORDER BY
子句指定的顺序对查询结果集中的所有行进行排名。DENSE_RANK
函数返回无间隙的排名数字序列。
DENSE_RANK
按以下方式执行:
-
按
ORDER BY
子句指定的顺序对分区行进行排序。 -
比较前一行与当前行的
ORDER BY
值,并按以下方式对当前行进行排名:-
如果
ORDER BY
值相同,则当前行获得的排名与前一行相同。注意
Null 值被视为相等的值。有关如何对 null 值进行排序的详细信息,请参阅 NULL 排序顺序。 -
如果
ORDER BY
值不同,DENSE_RANK
会依据升序或降序的排序顺序,将当前行的排名增加或减少 1 个名次。
-
DENSE_RANK
始终将排名更改 1 个名次,因此排名序列中不会出现间隙。最大排名值是查询返回的唯一 ORDER BY
值的数量。
行为类型
不可变语法
DENSE_RANK() OVER (
[ window-partition-clause ]
window-order-clause )
参数
OVER()
- 请参阅分析函数。
请参阅分析函数
与 RANK 的对比
RANK
会在排名序列中留下间隙,而 DENSE_RANK
不会出现该情况。以下示例将两种函数的运算操作进行了比较。
示例
以下查询调用 RANK
和 DENSE_RANK
,按照年收入对客户进行排名。两种函数返回了不同的排名,如下所示:
-
如果
annual_salary
包含重复值,RANK()
会插入重复排名,然后跳过一个或多个值,例如从 4 跳到 6,从 7 跳到 9。 -
在平行列
Dense Rank
中,DENSE_RANK()
也会插入重复排名,但不会在排名序列中留下间隙:
=> SELECT employee_region region, employee_key, annual_salary,
RANK() OVER (PARTITION BY employee_region ORDER BY annual_salary) Rank,
DENSE_RANK() OVER (PARTITION BY employee_region ORDER BY annual_salary) "Dense Rank"
FROM employee_dimension;
region | employee_key | annual_salary | Rank | Dense Rank
----------------------------------+--------------+---------------+------+------------
West | 5248 | 1200 | 1 | 1
West | 6880 | 1204 | 2 | 2
West | 5700 | 1214 | 3 | 3
West | 9857 | 1218 | 4 | 4
West | 6014 | 1218 | 4 | 4
West | 9221 | 1220 | 6 | 5
West | 7646 | 1222 | 7 | 6
West | 6621 | 1222 | 7 | 6
West | 6488 | 1224 | 9 | 7
West | 7659 | 1226 | 10 | 8
West | 7432 | 1226 | 10 | 8
West | 9905 | 1226 | 10 | 8
West | 9021 | 1228 | 13 | 9
...
West | 56 | 963104 | 2794 | 2152
West | 100 | 992363 | 2795 | 2153
East | 8353 | 1200 | 1 | 1
East | 9743 | 1202 | 2 | 2
East | 9975 | 1202 | 2 | 2
East | 9205 | 1204 | 4 | 3
East | 8894 | 1206 | 5 | 4
East | 7740 | 1206 | 5 | 4
East | 7324 | 1208 | 7 | 5
East | 6505 | 1208 | 7 | 5
East | 5404 | 1208 | 7 | 5
East | 5010 | 1208 | 7 | 5
East | 9114 | 1212 | 11 | 6
...