DENSE_ RANK 視窗功能 - Amazon Redshift

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

DENSE_ RANK 視窗功能

DENSE_ RANK window 函數會根據子句中的 OVER BY 運算式,決定值群組中的值的等級。ORDER如果存在可選 PARTITION BY 子句,則會針對每一組資料列重設排名。在排名準則中有相等值的列獲得相同排名。該 DENSE _ RANK 函數從一個RANK方面不同:如果兩個或多個行配合,有在排名值的序列沒有間隙。例如,假設兩列都排名 1,則下一個排名為 2

您可以在同一個查詢中具有不同 PARTITION ORDER BY 和 BY 子句的排名函數。

語法

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

引數

( )

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

OVER

DENSE_ RANK 函數的視窗子句。

PARTITION通過表達式列表

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

ORDER按訂單列表

(選用) 排名值所根據的運算式。如果未指定 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 | +---------+----------+-----+---------+-------+-----+