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