DENSE_RANK [analytic]

在每个窗口分区内,按窗口的 ORDER BY 子句指定的顺序对查询结果集中的所有行进行排名。DENSE_RANK 函数返回无间隙的排名数字序列。

DENSE_RANK 按以下方式执行:

  1. ORDER BY 子句指定的顺序对分区行进行排序。

  2. 比较前一行与当前行的 ORDER BY 值,并按以下方式对当前行进行排名:

    • 如果 ORDER BY 值相同,则当前行获得的排名与前一行相同。

    • 如果 ORDER BY 值不同,DENSE_RANK 会依据升序或降序的排序顺序,将当前行的排名增加或减少 1 个名次。

DENSE_RANK 始终将排名更改 1 个名次,因此排名序列中不会出现间隙。最大排名值是查询返回的唯一 ORDER BY 值的数量。

行为类型

不可变

语法

DENSE_RANK() OVER (
    [ window-partition-clause ]
    window-order-clause  )

参数

OVER()
请参阅分析函数

请参阅分析函数

与 RANK 的对比

RANK 会在排名序列中留下间隙,而 DENSE_RANK 不会出现该情况。以下示例将两种函数的运算操作进行了比较。

示例

以下查询调用 RANKDENSE_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
 ...

另请参阅

SQL 分析