【rownumber和rank區(qū)別】在SQL查詢中,`ROW_NUMBER()` 和 `RANK()` 是兩個(gè)常用的窗口函數(shù),用于對(duì)數(shù)據(jù)進(jìn)行排序并分配序號(hào)。雖然它們的功能相似,但在實(shí)際使用中存在明顯的差異。以下是對(duì)這兩個(gè)函數(shù)的總結(jié)與對(duì)比。
一、基本概念
- ROW_NUMBER()
為每一行分配一個(gè)唯一的序號(hào),即使有相同的值,也會(huì)被賦予不同的序號(hào)。它按照指定的排序規(guī)則依次編號(hào),不會(huì)跳過任何數(shù)字。
- RANK()
會(huì)根據(jù)排序結(jié)果對(duì)行進(jìn)行排名,如果有相同值的行,它們會(huì)獲得相同的排名,并且后續(xù)的排名會(huì)跳過這些重復(fù)的排名。例如,如果有兩行并列第一,則下一行的排名是第三。
二、使用場(chǎng)景對(duì)比
| 特性 | ROW_NUMBER() | RANK() |
| 是否允許重復(fù)編號(hào) | 否(每個(gè)行都有唯一編號(hào)) | 是(相同值可獲得相同排名) |
| 排名是否連續(xù) | 是(1,2,3,...) | 否(可能跳躍,如1,1,3) |
| 適用場(chǎng)景 | 需要唯一標(biāo)識(shí)每條記錄時(shí) | 需要計(jì)算排名且允許并列時(shí) |
| 對(duì)重復(fù)值的處理 | 不影響編號(hào),仍按順序分配 | 相同值獲得相同排名,后續(xù)排名跳過 |
三、示例說明
假設(shè)有一個(gè)成績表如下:
| 學(xué)生 | 成績 |
| A | 90 |
| B | 85 |
| C | 90 |
| D | 80 |
使用 `ROW_NUMBER()` 按成績降序排列:
| 學(xué)生 | 成績 | row_number() |
| A | 90 | 1 |
| C | 90 | 2 |
| B | 85 | 3 |
| D | 80 | 4 |
使用 `RANK()` 按成績降序排列:
| 學(xué)生 | 成績 | rank() |
| A | 90 | 1 |
| C | 90 | 1 |
| B | 85 | 3 |
| D | 80 | 4 |
四、總結(jié)
- `ROW_NUMBER()` 更適合需要唯一標(biāo)識(shí)每條記錄的場(chǎng)景。
- `RANK()` 更適合需要排名且允許并列的情況。
- 在處理重復(fù)值時(shí),兩者的行為截然不同,選擇合適的函數(shù)取決于具體業(yè)務(wù)需求。
通過合理使用這兩個(gè)函數(shù),可以更高效地實(shí)現(xiàn)數(shù)據(jù)排序與分析。


