RANK 窗口函数 - Amazon Redshift

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)