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


  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值