Oracle中row_number()、rank()断医、dense_rank() 的區(qū)別

row_number的用途非常廣泛滞乙,排序最好用它,它會(huì)為查詢出來(lái)的每一行記錄生成一個(gè)序號(hào)鉴嗤,依次排序且不會(huì)重復(fù)斩启,注意使用row_number函數(shù)時(shí)必須要用over子句選擇對(duì)某一列進(jìn)行排序才能生成序號(hào)。

rank函數(shù)用于返回結(jié)果集的分區(qū)內(nèi)每行的排名醉锅,行的排名是相關(guān)行之前的排名數(shù)加一兔簇。簡(jiǎn)單來(lái)說(shuō)rank函數(shù)就是對(duì)查詢出來(lái)的記錄進(jìn)行排名,與row_number函數(shù)不同的是硬耍,rank函數(shù)考慮到了over子句中排序字段值相同的情況垄琐,如果使用rank函數(shù)來(lái)生成序號(hào),over子句中排序字段值相同的序號(hào)是一樣的经柴,后面字段值不相同的序號(hào)將跳過(guò)相同的排名號(hào)排下一個(gè)狸窘,也就是相關(guān)行之前的排名數(shù)加一,可以理解為根據(jù)當(dāng)前的記錄數(shù)生成序號(hào)坯认,后面的記錄依此類推翻擒。

dense_rank函數(shù)的功能與rank函數(shù)類似,dense_rank函數(shù)在生成序號(hào)時(shí)是連續(xù)的牛哺,而rank函數(shù)生成的序號(hào)有可能不連續(xù)陋气。dense_rank函數(shù)出現(xiàn)相同排名時(shí),將不跳過(guò)相同排名號(hào)荆隘,rank值緊接上一次的rank值恩伺。在各個(gè)分組內(nèi),rank()是跳躍排序椰拒,有兩個(gè)第一名時(shí)接下來(lái)就是第四名晶渠,dense_rank()是連續(xù)排序凰荚,有兩個(gè)第一名時(shí)仍然跟著第二名。

借助實(shí)例能更直觀地理解:

假設(shè)現(xiàn)在有一張學(xué)生表student褒脯,學(xué)生表中有姓名便瑟、分?jǐn)?shù)、課程編號(hào)番川。
select * from student;

1.png

現(xiàn)在需要按照課程對(duì)學(xué)生的成績(jī)進(jìn)行排序:
--row_number() 順序排序
select name,course,row_number() over(partition by course order by score desc) rank from student;

2.png

--rank() 跳躍排序到涂,如果有兩個(gè)第一級(jí)別時(shí),接下來(lái)是第三級(jí)別
select name,course,rank() over(partition by course order by score desc) rank from student;

3.png

dense_rank() 連續(xù)排序颁督,如果有兩個(gè)第一級(jí)別時(shí)践啄,接下來(lái)是第二級(jí)別
select name,course,dense_rank() over(partition by course order by score desc) rank from student;</pre>

4.png

取得每門課程的第一名:

--每門課程第一名只取一個(gè):
select * from (select name,course,row_number() over(partition by course order by score desc) rank from student) where rank=1; --每門課程第一名取所有:
select * from (select name,course,dense_rank() over(partition by course order by score desc) rank from student) where rank=1; --每門課程第一名取所有:
select * from (select name,course,rank() over(partition by course order by score desc) rank from student) where rank=1;
附:每門課程第一名取所有的其他方法(使用group by 而不是partition by):

select s.* from student sinner join(select course,max(score) as score from student group by course) con s.course=c.course and s.score=c.score; --或者使用using關(guān)鍵字簡(jiǎn)化連接
select ***** from student sinner join(select course,max(score) as score from student group by course) c
  using(course,score);

關(guān)于Parttion by:

Parttion by關(guān)鍵字是Oracle中分析性函數(shù)的一部分,用于給結(jié)果集進(jìn)行分區(qū)沉御。它和聚合函數(shù)Group by不同的地方在于它只是將原始數(shù)據(jù)進(jìn)行名次排列屿讽,能夠返回一個(gè)分組中的多條記錄(記錄數(shù)不變),而Group by是對(duì)原始數(shù)據(jù)進(jìn)行聚合統(tǒng)計(jì)吠裆,一般只有一條反映統(tǒng)計(jì)值的結(jié)果(每組返回一條)伐谈。

TIPS:

使用rank over()的時(shí)候,空值是最大的试疙,如果排序字段為null, 可能造成null字段排在最前面诵棵,影響排序結(jié)果。

可以這樣: rank over(partition by course order by score desc nulls last)

總結(jié):

在使用排名函數(shù)的時(shí)候需要注意以下三點(diǎn):

1祝旷、排名函數(shù)必須有 OVER 子句履澳。

2、排名函數(shù)必須有包含 ORDER BY 的 OVER 子句缓屠。

3奇昙、分組內(nèi)從1開(kāi)始排序。

轉(zhuǎn)載自:
https://www.cnblogs.com/qiuting/p/7880500.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末敌完,一起剝皮案震驚了整個(gè)濱河市储耐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌滨溉,老刑警劉巖什湘,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異晦攒,居然都是意外死亡闽撤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門脯颜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)哟旗,“玉大人,你說(shuō)我怎么就攤上這事≌⒉停” “怎么了饱亮?”我有些...
    開(kāi)封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)舍沙。 經(jīng)常有香客問(wèn)我近上,道長(zhǎng),這世上最難降的妖魔是什么拂铡? 我笑而不...
    開(kāi)封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任壹无,我火速辦了婚禮,結(jié)果婚禮上感帅,老公的妹妹穿的比我還像新娘斗锭。我一直安慰自己,他們只是感情好失球,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布拒迅。 她就那樣靜靜地躺著,像睡著了一般她倘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上作箍,一...
    開(kāi)封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天硬梁,我揣著相機(jī)與錄音,去河邊找鬼胞得。 笑死荧止,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阶剑。 我是一名探鬼主播跃巡,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼牧愁!你這毒婦竟也來(lái)了素邪?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤猪半,失蹤者是張志新(化名)和其女友劉穎兔朦,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體磨确,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沽甥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乏奥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摆舟。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出恨诱,到底是詐尸還是另有隱情媳瞪,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布胡野,位于F島的核電站材失,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏硫豆。R本人自食惡果不足惜龙巨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望熊响。 院中可真熱鬧旨别,春花似錦、人聲如沸汗茄。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)洪碳。三九已至递览,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞳腌,已是汗流浹背绞铃。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嫂侍,地道東北人儿捧。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像挑宠,于是被迫代替她去往敵國(guó)和親菲盾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容