문제 출처: leetcode.com/problems/department-highest-salary/
문제. 각 부서에서 salary 가장 높은 사람 뽑기
출력 형태
Solution1. FROM 절에서 Subquery + MAX() 윈도우함수
1) subquery에서 max() 윈도우함수를 써서 부서 별 가장 높은 salary를 구해준다 (M_Salary)
subquery는 이런 테이블을 가지게 된다.
-----------------------------------------
| Name | Salary | DepartmentId | M_Salary |
-----------------------------------------
Joe 70000 1 90000
Jim 90000 1 90000
Henry 80000 2 80000
Sam 60000 2 80000
Max 90000 1 90000
-------------------------------------------
2) INNER JOIN 으로 부서 정보 매칭하기
지금은 부서 Id로만 표기되어 있는데, 각 Id가 어떤 부서인지 명시하기 위해 department table과 inner join 해준다.
3) WHERE 절에서 Salary = M_Salary인 행만 추출하기
1번에서 부서별 MAX Salary 값을 구해주었다. 만약 나의 Salary와 우리 부서의 Max_salary가 같다면 내가 우리부서에서 가장 salary가 높다고 판단할 수 있다.
SELECT d.Name as Department
, e.Name as Employee
, e.Salary as Salary
FROM (SELECT Name
, Salary
, DepartmentId
, MAX(Salary) OVER (PARTITION BY DepartmentId) as M_Salary
FROM Employee) e
INNER JOIN Department d
ON e.DepartmentId = d.Id
WHERE e.Salary = e.M_Salary
Solution2. Where 절 안에서 Subquery + MAX() 윈도우 함수
1) 부서명 매칭을 위해 Department 테이블과 join 한다.
2) WHERE 절에서 부서 id1일때와 부서 id가 2일때 각각 subquery안에서 각부서의 salary max값을 구해서 추출해준다.
SELECT D.Name AS Department
, E.Name AS Employee
, E.Salary
FROM Employee E
INNER JOIN Department D
ON E.DepartmentID = D.Id
WHERE (D.Id = 1 AND E.Salary IN (SELECT MAX(Salary) OVER (PARTITION BY DepartmentId) FROM Employee WHERE DepartmentId = 1))
OR (D.Id = 2 AND E.Salary IN (SELECT MAX(Salary) OVER (PARTITION BY DepartmentId) FROM Employee WHERE DepartmentId = 2))
2번 솔루션은 만약에 부서가 100개로 늘어난다거나 그런데 그중 5개 부서는 빠져있다거나 하는 등의 이슈가 있을 때 감당할 수 없어지는 코드이다. 1번 솔루션이 확장 가능성면에서 더 나은 코드이다.
'Today I Learned > SQL 문제풀이' 카테고리의 다른 글
leetcode 1907. Count Salary Categories (열 -> 행으로 변환) (0) | 2023.12.29 |
---|---|
leetcode 1280. Students and Examinations (cross join) (1) | 2023.12.22 |
[해커랭크] Top Competitors (0) | 2020.11.28 |
[hackerrank] Symmetric Pairs (0) | 2020.11.05 |