문제. Leetcode SQL, 184. Department Highest Salary
SQL Schema.
The Employee table holds all employees. Every employee has an Id, a salary, and there is also a column for the department Id.
+----+-------+--------+--------------+
| Id | Name | Salary | DepartmentId |
+----+-------+--------+--------------+
| 1 | Joe | 70000 | 1 |
| 2 | Jim | 90000 | 1 |
| 3 | Henry | 80000 | 2 |
| 4 | Sam | 60000 | 2 |
| 5 | Max | 90000 | 1 |
+----+-------+--------+--------------+
The Department table holds all departments of the company.
+----+----------+
| Id | Name |
+----+----------+
| 1 | IT |
| 2 | Sales |
+----+----------+
Write a SQL query to find employees who have the highest salary in each of the departments. For the above tables, your SQL query should return the following rows (order of rows does not matter).
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT | Max | 90000 |
| IT | Jim | 90000 |
| Sales | Henry | 80000 |
+------------+----------+--------+
Explanation:
Max and Jim both have the highest salary in the IT department and Henry has the highest salary in the Sales department.
출처 : Leetcode SQL 184. Department Highest Salary
나의 풀이 in MySQL
SELECT B.Name Department, A.Name Employee, A.Salary Salary
FROM (SELECT Name,DepartmentId,Salary FROM Employee
WHERE (Salary,DepartmentId) IN
(SELECT MAX(Salary),DepartmentId FROM Employee GROUP BY DepartmentId)) A
JOIN Department B ON A.DepartmentId = B.Id
문제는 부서별 최고액의 봉급을 받는 사람의 이름과 해당 부서, 봉급을 요구합니다.
중요 포인트는 2가지입니다.
1. Employee에서 부서별 최고액의 봉급을 출력 시 부서별 하나의 행만 뽑힌다.
2. 부서별 최고액의 봉급을 받는 사람이 한 명이 아닐 수도 있기에 이를 출력 시 해당하는 이름을 출력하기 위해서는 서브쿼리를 사용해야 한다.
그냥 단순히 Select Name, MAX(Salary) FROM Employee GROUP BY DepartmentId를 실행할 경우, 이름과 부서, 최고액의 봉급이 맞춰서 출력되지 않습니다. 따라서, 부서별 최고액 봉급을 WHERE문에서 멀티키로 활용해야 합니다.
다른 사람의 풀이
select d.Name as Department, e.Name as Employee, e.Salary
from Employee as e
join Department as d
on e.DepartmentId = d.Id
join (
select max(Salary) as Salary, DepartmentId
from Employee
group by DepartmentId
) as mx
on e.Salary = mx.Salary and e.DepartmentId = mx.DepartmentId
;
물론, 이렇게 JOIN을 여러 번 사용함으로써 문제를 풀 수도 있습니다. 개인적으로 여러 번의 JOIN보다는 서브쿼리를 선호하는 편이라서 저는 서브쿼리를 사용하여 풀어봤습니다.
반응형
'Tests > Leetcode' 카테고리의 다른 글
[leetcode] MySQL > 180. Consecutive Numbers (0) | 2020.09.14 |
---|---|
[leetcode] MySQL > 183. Customers Who Never Order (0) | 2020.09.12 |
[leetcode] MySQL > 185. Department Top Three Salaries (0) | 2020.09.11 |
[leetcode] 177. Nth Highest Salary (MySQL) (0) | 2020.09.10 |
[leetcode] MySQL > 178. Rank Scores (0) | 2020.09.09 |
댓글