리트코드의 184번 문제 Department Highest Salary를 윈도우 함수를 사용해 풀어보았다.
데이터리안 강좌를 들으면서 자주 등장한 연습 문제라 문제는 이제 아주 익숙하다.
주어진 테이블에서 각 부서(Department)마다 임금(Salary)가 가장 높은 사람(Employee)를 찾는 문제이다.
Department, Employee, Salary 형태의 테이블로 출력하면 된다.
WHERE 서브쿼리에 윈도우함수, FROM 서브쿼리에 윈도우함수를 사용해 총 두 가지 풀이를 하였다.
위 내용을 작성한 쿼리는 아래와 같다.
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))
이건 부서가 두 개 뿐이고, 또 그 사실을 알고 있기 때문에 가능하다.
결국 각 부서마다 일일이 서브쿼리를 작성해줘야하는 코드이기 때문에 좋지 못한 코드이다.
그래서 이를 FROM 절 서브쿼리로 바꿔 풀었다.
위 내용을 작성한 쿼리는 아래와 같다.
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 Max_Salary
FROM Employee) e
INNER JOIN Department d
ON e.DepartmentId = d.Id
WHERE e.Salary = e.Max_Salary
이 풀이는 첫 번째 풀이처럼 일일이 Max Salary를 구하는 방법이 아니고
또 만약 특정 부서는 계산에서 제외하겠다던지 추가 조건을 붙일 때도 유연하게 수정할 수 있어 좀 더 확장성이 좋은 코드이다. 바로 두 번째같은 풀이를 생각해낼 수 있도록 훈련해야겠다 ㅠ