DENSE_RANK 視窗函數 - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

DENSE_RANK 視窗函數

DENSE_RANK 視窗函數會根據子OVER句中的 ORDER BY 表達式,決定值群組中值的排名。如果存在選用的 PARTITION BY 子句,則會為每個資料列群組重設排名。在排名準則中有相等值的列獲得相同排名。DENSE_RANK 函數RANK在某個方面與 不同:如果兩個或更多資料列綁定,排序值的序列中不會有間隙。例如,假設兩列都排名 1,則下一個排名為 2

您可以在相同的查詢中使用具有不同 PARTITION BY 和 ORDER BY 子句的排序函數。

語法

DENSE_RANK() OVER ( [ PARTITION BY expr_list ] [ ORDER BY order_list ] )

引數

( )

此函數不接受引數,但需要空括號。

OVER

DENSE_RANK 函數的視窗子句。

PARTITION 依 expr_list 排序

(選用) 一或多個用於定義視窗的運算式。

ORDER BY 訂單_清單

(選用) 排名值所根據的運算式。如果未指定 PARTITION BY,ORDERBY 會使用整個資料表。如果省略 ORDER BY,則傳回值1適用於所有資料列。

如果 ORDER BY 未產生唯一的排序,則資料列的順序是非確定的。如需詳細資訊,請參閱範圍函數的資料唯一排序

傳回類型

INTEGER

範例

下列範例使用範圍函數的範例資料表。如需詳細資訊,請參閱範圍函數範例的範例資料表

以下範例依銷售數量排序資料表,並將密集排名和一般排名指派給每一列。套用範圍函數結果之後排序結果。

SELECT salesid, qty, DENSE_RANK() OVER(ORDER BY qty DESC) AS d_rnk, RANK() OVER(ORDER BY qty DESC) AS rnk FROM winsales ORDER BY 2,1; +---------+-----+-------+-----+ | salesid | qty | d_rnk | rnk | +---------+-----+-------+-----+ | 10001 | 10 | 5 | 8 | | 10006 | 10 | 5 | 8 | | 30001 | 10 | 5 | 8 | | 40005 | 10 | 5 | 8 | | 30003 | 15 | 4 | 7 | | 20001 | 20 | 3 | 4 | | 20002 | 20 | 3 | 4 | | 30004 | 20 | 3 | 4 | | 10005 | 30 | 2 | 2 | | 30007 | 30 | 2 | 2 | | 40001 | 40 | 1 | 1 | +---------+-----+-------+-----+

請注意,在相同查詢中並排使用 DENSE_RANK 和 RANK函數時,指派給相同資料列的排名差異。

下列範例會依 sellerid 分割資料表,並依數量排序每一個分割區,然後指派密集排名給每一列。套用範圍函數結果之後排序結果。

SELECT salesid, sellerid, qty, DENSE_RANK() OVER(PARTITION BY sellerid ORDER BY qty DESC) AS d_rnk FROM winsales ORDER BY 2,3,1; +---------+----------+-----+-------+ | salesid | sellerid | qty | d_rnk | +---------+----------+-----+-------+ | 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 | +---------+----------+-----+-------+

若要成功使用最後一個範例,請使用下列命令將資料列插入WINSALES資料表。此列與另一列具有相同的 buyid、sellerid 和 qtysold。這會導致最後一個範例中的兩列綁定,因此會顯示 DENSE_RANK 和 RANK函數之間的差異。

INSERT INTO winsales VALUES(30009, '2/2/2003', 3, 'b', 20, NULL);

下列範例會依 buyerid 和 sellerid 分割資料表,並依數量排序每一個分割區,然後同時指派密集排名和一般排名給每一列。(選用) 套用範圍函數之後對結果進行排序。

SELECT salesid, sellerid, qty, buyerid, DENSE_RANK() OVER(PARTITION BY buyerid, sellerid ORDER BY qty DESC) AS d_rnk, RANK() OVER (PARTITION BY buyerid, sellerid ORDER BY qty DESC) AS rnk FROM winsales ORDER BY rnk; +---------+----------+-----+---------+-------+-----+ | salesid | sellerid | qty | buyerid | d_rnk | rnk | +---------+----------+-----+---------+-------+-----+ | 20001 | 2 | 20 | b | 1 | 1 | | 30007 | 3 | 30 | c | 1 | 1 | | 10006 | 1 | 10 | c | 1 | 1 | | 10005 | 1 | 30 | a | 1 | 1 | | 20002 | 2 | 20 | c | 1 | 1 | | 30009 | 3 | 20 | b | 1 | 1 | | 40001 | 4 | 40 | a | 1 | 1 | | 30004 | 3 | 20 | b | 1 | 1 | | 10001 | 1 | 10 | c | 1 | 1 | | 40005 | 4 | 10 | a | 2 | 2 | | 30003 | 3 | 15 | b | 2 | 3 | | 30001 | 3 | 10 | b | 3 | 4 | +---------+----------+-----+---------+-------+-----+