思路1:找出每个部门获得前三高工资的所有员工,将这个表左连接自己,条件为部门编号相同且工资1比工资2低。这样如果结果中某人的Id号出现次数大于2,那么说明他排不进前三名(0次第一名,没有人比他高,1次第二名,有一个人比他高,2次第三名,有两个人比他高)。
select e1.Id
from Employee as e1 left join Employee as e2
on e1.DepartmentId = e2.DepartmentId and e1.Salary < e2.Salary
group by e1.Id
having count(e1.Id)<=2
但是这个排名是根据人数排名的,即如果有三人并列第一名那么绝对成绩第二名的人并不会被提取出来。
思路2:按照绝对工资值排,假设有三人并列第一,两人并列第二,三人并列第三那么这8个人都会被提取出来。
select e1.Id
from Employee as e1 left join Employee as e2
on e1.DepartmentId = e2.DepartmentId and e1.Salary < e2.Salary
group by e1.Id
having count(distinct e1.Salary)<=2