leetcode题目:查看部门工资前三高的人员
Employee 表包含所有员工信息,每个员工有其对应的工号 Id,姓名 Name,工资 Salary 和部门编号 DepartmentId
雇员表 Employee
NAME VARCHAR2(10)
SALARY NUMBER(10,2)
DEP_ID VARCHAR2(40)
ID NOT NULL VARCHAR2(36)
部门表 Department
ID NOT NULL NUMBER(38)
NAME VARCHAR2(10)
ORACLE实现方式:
select tt.* from (
select t.Name,d.Name as dep_name,
(dense_rank() OVER(PARTITION BY t.dep_id ORDER BY t.Salary DESC)) RK
from Employee t left join Department d on t.dep_id=d.Id ) tt where RK<=3< span="">
ORACLE 开窗函数简要说明:
rank() over([partition by col1] order by col2)
dense_rank() over([partition by col1] order by col2)
row_number() over([partition by col1] order by col2)
其中[partition by col1]可省略。
三个分组函数都是按照col1分组内从1开始排序,区别在于:
row_number() 是没有重复值的排序(即使两条记录相等也是不重复的)
dense_rank() 是连续排序,两个第二名仍然跟着第三名
rank() 是跳跃排序,两个第二名下来就是第四名(并列第一)
总结rank() 函数相同的排名相同
dense_rank() 相同的排名后也是连续的
row_number() 无重复值
rank() 是跳跃排序,两个第二名下来就是第四名
MySQL怎么实现?
8.0就很好实现了,和ORACLE一样,MySQL同样提供了开窗函数,8.0之前就很麻烦了。
8.0以前要用变量的方式(我反正看不懂),自己查资料看去。
先试试rank() 函数部门1 pony和Henry并列第四,也就没有第5
row_number() 并列的 pony和Henry也是不同的排名
select t.*, row_number() over(PARTITION by dep_id order by salary)
as sal_order from employee t
dese_rank() 并列的排名之后也是跟着下一个排名
select t.*, dense_rank() over(PARTITION by dep_id order by salary)
as sal_order from employee t
这样要得到前三的排名就很容易了,在嵌套一层查询。