本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
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)