本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
RANK 視窗函數
RANK 視窗函數根據 OVER 子句中的 ORDER BY 表達式,決定一組值之中某個值的排名。如果有選用的 PARTITION BY 子句,則會重設每一組列的排名。在排名準則中有相等值的列獲得相同排名。Amazon Redshift 會將繫結列數新增至繫結排名,以計算下一個排名,因此,排名可能不是相鄰數。例如,假設兩列都排名 1,則下一個排名為 3。
排名不同於DENSE_RANK 視窗函數在一個方面: 對於 DENSE_RANK,如果兩列以上繫結在一起,則排名值的序列中沒有間隙。例如,假設兩列都排名 1,則下一個排名為 2。
在相同查詢中,排名函數可以搭配不同的 PARTITION BY 和 ORDER BY 子句。
Syntax (語法)
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)