题目链接
解题思路
思路参照评论区点赞第一的大佬。
由于对 sql 语法还不是很熟悉,在思路描述上可能会出现词不达意的情况。
尝试解题时,首先想到的是将每个部门工资前三高的员工(id)主键找出来。
感觉在说废话。。。。。。
问题的关键在于如何找到每个部门工资前三员工的id。
通过表的自身连接,可以使每一个员工和所有员工都连接成一个元组。
这样每个员工和所有员工都有操作空间了。
要求的是每个部门,那么每一个员工就不需要和所有员工产生元组了,只需要和自己部门的员工产生一个元组就可以了。
在连接时按照部门 id 相等进行连接就可以实现该操作。
如何找到工资前三呢,只要比我工资高的工资数量小于等于二(有点绕,但是题目是这个意思),那么我就是前三了。
group by e1.id having count(distinc(e2.salary)) <= 2
自身连接时必须取别名来区分两个相同的表,e1 为表 1, e2 为表 2。
这一句是按 id 分组,且这一组的数量小于等于2。
就这样 每个部门工资前三高的员工id 就找出来了。
|
|
|
这是 SQL SERVER 代码。(各种数据库的代码几乎可以通用,如果不用花里胡哨的函数)
select d.Name as Department, e.Name as employee,e.salary as salary
from Employee as e left join Department as d
on e.DepartmentId = d.Id
where e.Id in (
select e1.id
from employee e1 left join employee e2
on e1.departmentid = e2.departmentid and e1.salary < e2.salary
group by e1.id
having count(distinct e2.salary) <= 2
)
and e.Departmentid in (select id from Department)
order by d.id asc, e.salary desc