rank()over(partition by order by)实现分组 排序 取前几数据

本文介绍如何使用SQL中的rank()函数进行记录排序,包括处理相同排名情况下的累加问题,并通过分组实现部门内部的工资排名。此外,还介绍了row_number()与rank()的区别,以及在Oracle和MySQL中查询特定排名记录的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Oracle、mysql、Hive、spark sql

1.使用 rank()over(order by)得到记录排序

根据工资排名,排名相同的时候下一个排名累加,比如第三和第四工资一样,那么第三第四排名都是3,第五排名是5而非4

dense_rank()实现的效果不累加,第五仍是4

 例:select code 编号,salary 工资,rank()over(order by salary desc) 排名 from CT_OA工资

2.使用rank()over(partition by order by)实现分组 排序

每个部门的工资排名

例:员工(id,code,name,pid)       (id,职工号,姓名,部门id)
   部门(id,code,name)             (id,编号,名称)

   工资表(id,code,salary)         (id,职工号,工资)

select y.name 姓名,b.name 部门,g.salary 工资,rank()over(partition by b.name order by g.salary desc) 排名 from CT_OA员工 y 
 inner join CT_OA部门 b on b.id=y.pid

inner join CT_OA工资 g on g.code=y.code

------------得到每个部门工资前3名

 select * from (第二步的结果)t where 排名<=3

总结:partition by进行分组,rank+order by 进行给每个分组内的记录进行排序

row_number()和rank()有个区别:row_number()不会出现相同排序,一直递增;就算两条记录参与排序的字段的数值一样,排序也是递增

ps:Oracle的group by不能查询不参与分组的字段,使用rank()over(partition by order by)可实现类似效果

查询每个部门工资第一位

实现mySQL:

SELECT t.name as 姓名,b.name as 部门,max(g.salary) as 工资 from CT_OA员工 t 
inner join CT_OA部门 b on b.id=t.pid 
inner join CT_OA工资 g on g.code=t.code

GROUP BY b.name 

而Oracle则是在第三步将"排名<=3" 改为"排名<=1"即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值