MySQL四大排名函數(MySQL8版本支持)


一、ROW_NUMBER ()

--語法形式:  ROW_NUMBER()  OVER(PARTITION BY COL1 ORDER BY COL2) 
--解釋:     根據COL1分組,在分組內部根據 COL2排序,而此函數計算的值就表示每組內部排序后的順序編號(組內連續的唯一的)

舉例說明:

select ROW_NUMBER() over(order by id1) odid,* from #t1

select ROW_NUMBER() over(partition by id1 order by id1) odid,* from #t1

常用的使用場景: 取每個學科的前3名

select * from 
( select subject,name,score,ROW_NUMBER() over(PARTITION by subject order by score desc) as num from #score 
) T where T.num <= 3 order by subject 

結果:

 二、RANK()

定義:RANK()函數,顧名思義排名函數,可以對某一個字段進行排名,這里得區分和ROW_NUMBER()不一樣的地方,ROW_NUMBER()是排序,當存在相同成績的學生時,ROW_NUMBER()會依次進行排序,他們序號不相同,而使用Rank()時,出現相同成績時,他們的排名是一樣的。
舉例說明row_number()和rank()的區別:

 

當出現兩個學生成績相同時,ROW_NUMBER()排名不一樣,而rank()排名一樣。RANK()是 1 2 2,而ROW_NUMBER()則還是1 2 3,這就是RANK()和ROW_NUMBER()的區別了

 此函數也可以使用partition by進行分組

三、DENSE_RANK()

定義:DENSE_RANK()函數也是排名函數,和RANK()功能相似,也是對字段進行排名,那它和RANK()到底有什么不同那?看例子:

 DENSE_RANK()密集的排名他和RANK()區別在於,排名的連續性,DENSE_RANK()排名是連續的,RANK()是跳躍的排名,所以一般情況下用的排名函數就是RANK()。

 此函數也可以使用partition by進行分組

四、NTILE() 

定義:NTILE()函數是將有序分區中的行分發到指定數目的組中,各個組有編號,編號從1開始,就像我們說的’分區’一樣 ,分為幾個區,一個區會有多少個。

 這里查詢了3次,第一次分為1個’區’ ,所以查詢結果number全是1,第二次分為2個區,查詢結果為 1 1 2,意思就是 第一個 ‘區’ 為 1 1 兩個編號的數據 ,第二個’區’只有2這個數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM