一、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這個數據。