Oracle
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"即可