場景
數據庫查詢中,很多時候都會遇到對數據進行分組,然後組內排序加序號的需求。
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