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)