持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情
一、题目
表: 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查询,找出每个部门中 收入高的员工 。
- 来源:力扣(LeetCode)
- 链接:leetcode.cn/problems/de…
- 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路
创建数据表
根据题意创建数据表,并填充数据
Create table If Not Exists Employee (id int, name varchar(255), salary int, departmentId int);
Create table If Not Exists Department (id int, name varchar(255));
Truncate table Employee;
insert into Employee values ('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');
Truncate table Department;
insert into Department (id, name) values ('1', 'IT');
insert into Department (id, name) values ('2', 'Sales');
解题思路
- 根据题意,要找每个部门中挣钱最多的排名前三的员工
- 首先通过内连接将员工与部门连接起来
- 对员工的薪水去重,创建虚拟表比较员工之间的薪水,同时要判断员工的id要相同,判断相同的原因是员工的薪水可能会相同
- 这里取前三个就可以了,设置
where 3 > (SELECT COUNT(DISTINCT e2.Salary) FROM Employee e2 WHERE e2.Salary > e1.Salary AND e1.DepartmentId = e2.DepartmentId ) - 最后执行语句
执行语句
SELECT
d.Name AS 'Department', e1.Name AS 'Employee', e1.Salary
FROM
Employee e1
JOIN
Department d ON e1.DepartmentId = d.Id
WHERE
3 > (SELECT
COUNT(DISTINCT e2.Salary)
FROM
Employee e2
WHERE
e2.Salary > e1.Salary
AND e1.DepartmentId = e2.DepartmentId
)
;
三、执行结果
四、总结
这里内连接将薪水和部门连接起来,但最重要的一点是where后的条件,这里的DISTINCT e2.Salary是对薪水的去重,COUNT是计算有多少种薪水,e2.Salary > e1.Salary AND e1.DepartmentId = e2.DepartmentId是用来对部门的薪水做对比,and后面的id相等是非常关键的,这里是为了设置如果计算薪水,这里设置的是以不同部门来计算薪水,当where 3>时就意味着这里计算的是每个部门中薪水前三的员工。