力扣185题: 部门工资前三高的所有员工

1、部门最高工资


select a.departmentid,a.salary  from Employee a left JOIN employee b  on a.DepartmentId=b.DepartmentId and a.Salary #1、表连接的意义在于A表与B表所有人工资进行一个比较
#2、左连接的意义在于当工资最高时候用内连接,会被过滤掉,左连接却可以返回
#3、整个SQL意思是同个部门每个员工都与自己部门所有人比较一轮,一个员工即为一轮,当某一轮a.Salary 最终结果为
departmentid    salary
2    80000
1    90000
2、部门前三工资、3、各部门前三工资


select a.departmentid,a.salary  from Employee a left JOIN employee b  on a.DepartmentId=b.DepartmentId and a.Salary #1、count(DISTINCT b.Salary)=0时候找出最高工资,count(DISTINCT b.Salary)=1则找出第二高工资,count(DISTINCT b.Salary)=2找出第三高工资,count(DISTINCT b.Salary)<3则找出前三高的工资
#2、count(DISTINCT b.Salary):这里按题目意思是并列只占用一个排名,即该级别工资不管多少个只算一个,需要去重
#3、count(DISTINCT b.Salary)是查出的结果后再过滤,配合group by 、having使用
#4、GROUP BY a.salary:每一轮的a.salary是一样的,只需要一个即可 ,a.departmentid:不同部门肯定要分组
最终结果为
departmentid    salary
2    60000
1    70000
2    80000
1    85000
1    90000
4、各部门前三工资的人员信息


select Department.name as Department , Employee.name as Employee ,employee.Salary  from  Employee left join Department  on employee.DepartmentId=Department.id where ( DepartmentId,salary) in 
(select a.departmentid,a.salary  from Employee a left JOIN employee b  on a.DepartmentId=b.DepartmentId and a.Salary #1、where前面的为员工表和部门表连接,按题目要求输出每个人的部门、姓名、工资
#2、where后面的为找到的每个每个部门的前三工资
#3、每个人与自己部门最高工资进行匹配一次,当这个人工资符合最高工资,即该员工就是该部门最高工资的人
最终结果为
Department    Employee    Salary
IT    Joe    85000
IT    Max    90000
IT    Randy    85000
IT    Will    70000
Sales    Henry    80000
Sales    Sam    60000


题目没要求对结果进行排序,需要排序可以再最终结果加上order by即可
select Department.name as Department , Employee.name as Employee ,employee.Salary  from  Employee left join Department  on employee.DepartmentId=Department.id where ( DepartmentId,salary) in 
(select a.departmentid,a.salary  from Employee a left JOIN employee b  on a.DepartmentId=b.DepartmentId and a.Salary

你可能感兴趣的:(刷题,leetcode)