RANK 窗口函数
RANK 窗口函数基于 OVER 子句中的 ORDER BY 表达式确定一组值中的一个值的排名。如果存在可选的 PARTITION BY 子句,则为每个行组重置排名。带符合排名标准的相同值的行接收相同的排名。Amazon Redshift 将关联行的数目添加到关联排名以计算下一个排名,因此排名可能不是连续数。例如,如果两个行的排名为 1,则下一个排名则为 3。
RANK 与 DENSE_RANK 窗口函数存在以下一点不同:对于 DENSE_RANK 来说,如果两个或两个以上的行结合,则一系列排名的值之间没有间隔。例如,如果两个行的排名为 1,则下一个排名则为 2。
您可以在同一查询中包含带有不同的 PARTITION BY 和 ORDER BY 子句的排名函数。
语法
RANK () OVER ( [ PARTITION BY expr_list ] [ ORDER BY order_list ] )
参数
- ( )
-
该函数没有参数,但需要空括号。
- OVER
-
适用于 RANK 函数的窗口子句。
- PARTITION BY expr_list
-
可选。一个或多个定义窗口的表达式。
- ORDER BY order_list
-
可选。定义排名值基于的列。如果未指定 PARTITION BY,则 ORDER BY 使用整个表。如果省略 ORDER BY,则所有行的返回值为 1。
如果 ORDER BY 未生成唯一顺序,则行的顺序是不确定的。有关更多信息,请参阅 窗口函数的唯一数据排序。
返回类型
INTEGER
示例
以下示例按销量对表进行排序(预设情况下按升序顺序),并为每个行分配一个排名。排名值 1 为排名最高的值。在应用窗口函数结果后,对结果进行排序:
select salesid, qty, rank() over (order by qty) as rnk from winsales order by 2,1; salesid | qty | rnk --------+-----+----- 10001 | 10 | 1 10006 | 10 | 1 30001 | 10 | 1 40005 | 10 | 1 30003 | 15 | 5 20001 | 20 | 6 20002 | 20 | 6 30004 | 20 | 6 10005 | 30 | 9 30007 | 30 | 9 40001 | 40 | 11 (11 rows)
请注意,本示例中的外部 ORDER BY 子句包括列 2 和列 1,以确保在每次运行查询时,Amazon Redshift 返回一致排序的结果。例如,销售 ID 为 10001 和 10006 的行具有相同的 QTY 和 RNK 值。按列 1 对最后的结果集进行排序可确保行 10001 始终在 10006 之前。有关 WINSALES 表的说明,请参阅窗口函数示例的示例表。
在下面的示例中,将窗口函数的顺序倒转 (order
by qty desc
)。现在,最高排名值将应用于最大的 QTY 值。
select salesid, qty, rank() over (order by qty desc) as rank from winsales order by 2,1; salesid | qty | rank ---------+-----+----- 10001 | 10 | 8 10006 | 10 | 8 30001 | 10 | 8 40005 | 10 | 8 30003 | 15 | 7 20001 | 20 | 4 20002 | 20 | 4 30004 | 20 | 4 10005 | 30 | 2 30007 | 30 | 2 40001 | 40 | 1 (11 rows)
有关 WINSALES 表的说明,请参阅窗口函数示例的示例表。
以下示例按 SELLERID 对表进行分区,按数量对每个分区进行排序(按降序顺序),并为每个行分配排名。在应用窗口函数结果后,对结果进行排序。
select salesid, sellerid, qty, rank() over (partition by sellerid order by qty desc) as rank from winsales order by 2,3,1; salesid | sellerid | qty | rank --------+----------+-----+----- 10001 | 1 | 10 | 2 10006 | 1 | 10 | 2 10005 | 1 | 30 | 1 20001 | 2 | 20 | 1 20002 | 2 | 20 | 1 30001 | 3 | 10 | 4 30003 | 3 | 15 | 3 30004 | 3 | 20 | 2 30007 | 3 | 30 | 1 40005 | 4 | 10 | 2 40001 | 4 | 40 | 1 (11 rows)