leetcode:185. 部门工资前三高的所有员工

表: Employee

±-------------±--------+
| Column Name | Type |
±-------------±--------+
| id | int |
| name | varchar |
| salary | int |
| departmentId | int |
±-------------±--------+
Id是该表的主键列。
departmentId是Department表中ID的外键。
该表的每一行都表示员工的ID、姓名和工资。它还包含了他们部门的ID。

表: Department

±------------±--------+
| Column Name | Type |
±------------±--------+
| id | int |
| name | varchar |
±------------±--------+
Id是该表的主键列。
该表的每一行表示部门ID和部门名。

公司的主管们感兴趣的是公司每个部门中谁赚的钱最多。一个部门的 高收入者 是指一个员工的工资在该部门的 不同 工资中 排名前三 。

编写一个SQL查询,找出每个部门中 收入高的员工 。

以 任意顺序 返回结果表。

查询结果格式如下所示。

示例 1:

输入:
Employee 表:
±—±------±-------±-------------+
| id | name | salary | departmentId |
±—±------±-------±-------------+
| 1 | Joe | 85000 | 1 |
| 2 | Henry | 80000 | 2 |
| 3 | Sam | 60000 | 2 |
| 4 | Max | 90000 | 1 |
| 5 | Janet | 69000 | 1 |
| 6 | Randy | 85000 | 1 |
| 7 | Will | 70000 | 1 |
±—±------±-------±-------------+
Department 表:
±—±------+
| id | name |
±—±------+
| 1 | IT |
| 2 | Sales |
±—±------+
输出:
±-----------±---------±-------+
| Department | Employee | Salary |
±-----------±---------±-------+
| IT | Max | 90000 |
| IT | Joe | 85000 |
| IT | Randy | 85000 |
| IT | Will | 70000 |
| Sales | Henry | 80000 |
| Sales | Sam | 60000 |
±-----------±---------±-------+
解释:
在IT部门:

  • Max的工资最高
  • 兰迪和乔都赚取第二高的独特的薪水
  • 威尔的薪水是第三高的

在销售部:

  • 亨利的工资最高
  • 山姆的薪水第二高
  • 没有第三高的工资,因为只有两名员工

解决方案一:

首先查询每个部门前3的员工的工资,然后通过联表查询方式查询出部门表的部门信息
– count(字段名) 返回表中该字段总共有多少条记录
– DISTINCT 字段名 过滤字段中的重复记录
– 假如部门一的员工的工资为[1000,2000,3000,3000,8000]
查询每个部门前3的员工的工资
select * from employee E1
where 3 >(
select count(distinct e2.salary) from employee E2
where E2.salary > E1.salary and E1.departmentId =E2.departmentId
)

此时查询出来的结果为

– e1=e2=[1000,2000,3000,3000,8000]
– e1.Salary = 1000,e2.Salary 可以取值 [2000,3000,3000,8000],count(DISTINCT e2.Salary) = 3
– e1.Salary = 2000,e2.Salary 可以取值 [3000,3000,8000],count(DISTINCT e2.Salary) = 2
– e1.Salary = 3000,e2.Salary 可以取值 [8000],count(DISTINCT e2.Salary) = 1
– 3>count(distinct e2.salary)
– 然后 3 > count(DISTINCT e2.Salary),所以 e1.Salary 可取值为 [2000,3000,3000,8000],即集合前 3 高的薪水
– 最后通过联表查询将部门的信息查询出来即可

select D1.name as Department,E1.name as Employee,E1.salary as Salary from employee E1
left join department D1 on
E1.departmentId = D1.id 
where 3 >(
	select  count(distinct e2.salary) from employee E2
	where E2.salary > E1.salary  and E1.departmentId =E2.departmentId 
)

版权声明:本文为weixin_44160044原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。