RANK [analytic]

在每个窗口分区内,按窗口的 ORDER BY 子句指定的顺序对查询结果集中的所有行进行排名。

RANK 按以下方式执行:

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

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

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

    • 如果 ORDER BY 值不同,DENSE_RANK 将按 1 递增或递减当前行的排名,再加上在其之前的行中的连续重复值数量。

最大排名值等于查询返回的总行数。

行为类型

不可变

语法

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

参数

OVER()
请参阅分析函数

与 DENSE_RANK 比较

RANK 会在排名序列中留下间隙,而 DENSE_RANK 不会出现这种情况。

示例

以下查询按州对自 2007 年以来成为公司客户的所有客户进行排名。在 customer_since 日期相同的行中,RANK 将为这些行分配相同的排名。当 customer_since 日期发生更改时,RANK 会跳过一个或多个排名 — 例如,在 CA 内从第 12 名到跳到第 14 名,以及从第 17 名跳到第 19 名。

=> SELECT customer_state, customer_name, customer_since,
    RANK() OVER (PARTITION BY customer_state ORDER BY customer_since) AS rank
    FROM customer_dimension WHERE customer_type='Company' AND customer_since > '01/01/2007'
    ORDER BY customer_state;
  customer_state | customer_name | customer_since | rank
----------------+---------------+----------------+------
 AZ             | Foodshop      | 2007-01-20     |    1
 AZ             | Goldstar      | 2007-08-11     |    2
 CA             | Metahope      | 2007-01-05     |    1
 CA             | Foodgen       | 2007-02-05     |    2
 CA             | Infohope      | 2007-02-09     |    3
 CA             | Foodcom       | 2007-02-19     |    4
 CA             | Amerihope     | 2007-02-22     |    5
 CA             | Infostar      | 2007-03-05     |    6
 CA             | Intracare     | 2007-03-14     |    7
 CA             | Infocare      | 2007-04-07     |    8
 ...
 CO             | Goldtech      | 2007-02-19     |    1
 CT             | Foodmedia     | 2007-02-11     |    1
 CT             | Metatech      | 2007-02-20     |    2
 CT             | Infocorp      | 2007-04-10     |    3
 ...

另请参阅

SQL 分析