排名函數、分割函數 ROW_NUMBER、RANK、DENSE_RANK、LEAD、LAG、NTILE 的用法
準備資料
1 | Drop TABLE #testTable |
原資料內容如下
1 | SELECT * FROM #testtable order by id; |
| id | name | age |
|---|---|---|
| 1 | Bill | 40 |
| 2 | Tom | 10 |
| 3 | Mary | 60 |
| 4 | Joe | 10 |
| 5 | Tim | 60 |
| 6 | Alice | 5 |
一、ROW_NUMBER()
1 | -- 對 age 排序後,再補上一行對 age 排序後的編號 |
| row | id | name | age |
|---|---|---|---|
| 1 | 6 | Alice | 5 |
| 2 | 2 | Tom | 10 |
| 3 | 4 | Joe | 10 |
| 4 | 1 | Bill | 40 |
| 5 | 5 | Tim | 60 |
| 6 | 3 | Mary | 60 |
二、RANK()
1 | -- 對 age 排序後,再補上一行對 age 排序後之排名(同名次之後會跳號) |
| row | id | name | age |
|---|---|---|---|
| 1 | 6 | Alice | 5 |
| 2 | 2 | Tom | 10 |
| 2 | 4 | Joe | 10 |
| 4 | 1 | Bill | 40 |
| 5 | 5 | Tim | 60 |
| 5 | 3 | Mary | 60 |
三、DENSE_RANK()
1 | -- 對 age 排序後,再補上一行對 age 排序後之排名(同名次之後不會跳號) |
| row | id | name | age |
|---|---|---|---|
| 1 | 6 | Alice | 5 |
| 2 | 2 | Tom | 10 |
| 2 | 4 | Joe | 10 |
| 3 | 1 | Bill | 40 |
| 4 | 5 | Tim | 60 |
| 4 | 3 | Mary | 60 |
四、LEAD()
1 | -- 對 age 排序後,再補上一行對 age 排序後之下一筆 age 值 |
| row | id | name | age |
|---|---|---|---|
| 10 | 6 | Alice | 5 |
| 10 | 2 | Tom | 10 |
| 40 | 4 | Joe | 10 |
| 60 | 1 | Bill | 40 |
| 60 | 5 | Tim | 60 |
| null | 3 | Mary | 60 |
五、LAG()
1 | -- 對 age 排序後,再補上一行對 age 排序後之上一筆 age 值 |
| row | id | name | age |
|---|---|---|---|
| null | 6 | Alice | 5 |
| 5 | 2 | Tom | 10 |
| 10 | 4 | Joe | 10 |
| 10 | 1 | Bill | 40 |
| 40 | 5 | Tim | 60 |
| 60 | 3 | Mary | 60 |
六、NTILE()
1 | -- 對 age 排序後,再補上一行對 age 排序後之自動對 age 值之等級判斷(此例有三個等級) |
| row | id | name | age |
|---|---|---|---|
| 1 | 6 | Alice | 5 |
| 1 | 2 | Tom | 10 |
| 2 | 4 | Joe | 10 |
| 2 | 1 | Bill | 40 |
| 3 | 5 | Tim | 60 |
| 3 | 3 | Mary | 60 |