次序函數:
Dense_Rank 數字連續。同名次後,名次連續。數字是連續的,不會有間距。 (例如:1223)Rank 數字不連續。同名次後,名次會跳號。 數字不一定是連續的。(例如:1224)Row_Number 流水號。 (例如:1234)
Row_Number 為流水號,
而Rank 與 Dense_Rank 的差異就在於
同名後,數字是不是連續的,還是跳過一個名次
1
2
3
| row_number() over (order by 欄位名稱) --流水號
dense_rank() over (order by 欄位名稱) --數字連續
rank() over (order by 欄位名稱) --數字不連續
|
Dense_Rank()
Dense_Rank 同名次後,名次是連續。數字是連續的,不會有間距。 (例如:1223)
語法
1
| DENSE_RANK () OVER ( [ <partition_by_clause> ] < order_by_clause > )
|
首先將 FROM 子句產生的結果集分割成分割區,然後將 DENSE_RANK 函式套用至每個分割區。 決定將 DENSE_RANK 函式套用至分割區中資料列的順序。 > `DENSE_RANK` 函式所傳回的數目不會有間距,次序值一律是連續的。 ## 範例 以販賣數量的多寡來進行商品的排名,排名是連續的 (同名次後,數字要連續不能有間距) ```sql -- 以販賣數量的多寡來進行商品的排名 select A.商品ID, B.商品名稱, sum(A.數量) as "數量", DENSE_RANK() over (order by sum(A.數量) desc) "排名" from 販賣資料 A join 商品清單 B on A.商品ID = B.商品ID group by A.商品ID, B.商品名稱 order by 排名 ``` 執行結果: ```sql 商品ID 商品名稱 數量 排名 2 筆記型電腦 8 1 5 15吋液晶螢幕 6 2 1 桌上型電腦 6 2 9 HUB 5 3 3 17吋螢幕 5 3 4 19吋螢幕 3 4 10 網路卡 2 5 7 印表機 1 6 8 掃描器 1 6 ``` # Rank() `Rank` 同名次後,數字不連續,會跳號。 (例如:1224) ## 語法 ```sql RANK ( ) OVER ( [ partition_by_clause ] order_by_clause ) ``` ## 範例 以販賣數量的多寡來進行商品的排名 (同名次後,數字不連續) ```sql --以販賣數量的多寡來進行商品的排名 select A.商品ID, B.商品名稱, sum(A.數量) as "數量", Rank() over (order by sum(A.數量) desc) "排名" from 販賣資料 A join 商品清單 B on A.商品ID = B.商品ID group by A.商品ID, B.商品名稱 order by 排名 ``` 執行結果: ``` 商品ID 商品名稱 數量 排名 2 筆記型電腦 8 1 5 15吋液晶螢幕 6 2 1 桌上型電腦 6 2 9 HUB 5 4 3 17吋螢幕 5 4 4 19吋螢幕 3 6 10 網路卡 2 7 7 印表機 1 8 8 掃描器 1 8 ``` # Row_Number() `Row_Number` 為流水號 ## 語法 ```sql ROW_NUMBER ( ) OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause ) ``` ## 範例 以販賣數量的多寡來進行商品的資料列編號 (流水號) ```sql select row_number() over (order by sum(A.數量) desc) as SEQ, A.商品ID, B.商品名稱, sum(A.數量) as "數量" from 販賣資料 A join 商品清單 B on A.商品ID = B.商品ID group by A.商品ID, B.商品名稱 order by SEQ ``` 執行結果: ``` SEQ 商品ID 商品名稱 數量 1 2 筆記型電腦 8 2 5 15吋液晶螢幕 6 3 1 桌上型電腦 6 4 9 HUB 5 5 3 17吋螢幕 5 6 4 19吋螢幕 3 7 10 網路卡 2 8 7 印表機 1 9 8 掃描器 1 ``` [MSDN - DENSE_RANK (Transact-SQL)](https://learn.microsoft.com/zh-tw/sql/t-sql/functions/dense-rank-transact-sql?view=sql-server-ver16) [MSDN - RANK (Transact-SQL)](https://learn.microsoft.com/zh-tw/sql/t-sql/functions/rank-transact-sql?view=sql-server-ver16) [MSDN - ROW_NUMBER (Transact-SQL)](https://learn.microsoft.com/zh-tw/sql/t-sql/functions/row-number-transact-sql?view=sql-server-ver16)