SQL SERVER中RANK、DENSE_RANK以及ROW_NUMBER區別

場景

數據庫查詢中,很多時候都會遇到對數據進行分組,然後組內排序加序號的需求。

RANK()、DENSE_RANK()以及ROW_NUMBER()這三個函數都是對分過組的數據排序加序號,這三個函數又各自有區別 

語法

ROW_NUMBER() OVER([PARTITION BY Colums1] ORDER BY colums2)  
DENSE_RANK() OVER([PARTITION BY Colums1] ORDER BY colums2)  
RANK() OVER([PARTITION BY colums1] ORDER BY colums2)  

[PARTITION BY colums1]是可選的,即不分組,或者說所有滿足條件的數據一組。

區別

三個函數都是按照colums1分組內從1開始排序
其中,ROW_NUMBER() 是沒有重複值的排序(即使兩條記錄相同,序號也不重複的),不會有同名次。
    DENSE_RANK() 是連續的排序,兩個第二名仍然跟着第三名。

    RANK()       是跳躍排序,兩個第二名下來就是第四名。

參考

/**
create table #temtable (dept varchar(20),names varchar(20) , age int ,salaries decimal(10,2))

insert into #temtable   
  SELECT 'dept1'  , 'name1'   , 25  , 8000   UNION ALL    
  SELECT 'dept1'  , 'name2'   , 33  , 9000   UNION ALL   
  SELECT 'dept1'  , 'name3'   , 33  , 9000   UNION ALL  
  SELECT 'dept1'  , 'name4'   , 33  , 5000   UNION ALL  
  SELECT 'dept2'  , 'name5'   , 29  , 6500   UNION ALL    
  SELECT 'dept2'  , 'name6'   , 28  , 5000   UNION ALL    
  SELECT 'dept2'  , 'name7'   , 29  , 5000   UNION ALL    
  SELECT 'dept2'  , 'name8'   , 25  , 7500   UNION ALL      
  SELECT 'dept2'  , 'name9'   , 29  , 6500    
  
--drop table #temtable 
**/
select * ,ROW_NUMBER() over(PARTITION by dept order by salaries) from #temtable

select * ,dense_rank() over(PARTITION by dept order by salaries) from #temtable

select * ,rank() over(PARTITION by dept order by salaries) from #temtable


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章