
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
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() 是跳跃排序,两个第二名下来就是第四名(并列第一)
评论