RANK [analytic]
在每个窗口分区内,按窗口的 ORDER BY
子句指定的顺序对查询结果集中的所有行进行排名。
RANK
按以下方式执行:
-
按
ORDER BY
子句指定的顺序对分区行进行排序。 -
比较前一行与当前行的
ORDER BY
值,并按以下方式对当前行进行排名:-
如果
ORDER BY
值相同,则当前行获得的排名与前一行相同。注意
Null 值被视为相等的值。有关如何对 null 值进行排序的详细信息,请参阅 NULL 排序顺序。 -
如果
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
...