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