最近去面试,被问到一个sql题,当场被摁住了命运的喉咙,思考良久,无奈说出不会二字,不用多说,面试肯定凉凉,回去之后,小菜鸟痛定思痛,决定恶补sql,在leetcode上正巧又碰到类似的问题,于是打算记录一下。
求部门工资前三高的员工的信息
有两张表,一张是department表,一张是employee表
employee表
department表
现在的问题是,求出部门工资前三高的员工的信息,包括部门名称,员工名,员工工资三个字段。注意:同一部门下的员工薪水相同则排名相同,如表中的joe和randy,两人的排名应该都为第二名
我们可以将问题分解,首先查找出同一部门下薪水前三高的员工
这里使用的是子查询
select e1.* from employee e1
where (select count(DISTINCT e2.salary) from employee e2
where e1.salary<e2.salary and e1.department_id=e2.department_id)<3;
其中count(字段名)表示返回该字段总共有多少条记录,distinct表示去重,
得到的结果为
之后在关联部门表,并根据部门名称和员工工资进行降序排序。
select d.name as department,e1.name as employee,e1.salary as salary
from employee e1 join department d on d.id=e1.department_id
where (select count(DISTINCT e2.salary) from employee e2
where e1.salary<e2.salary and e1.department_id=e2.department_id)<3
order by d.name,e1.salary desc;