[LeetCode] Department Highest Salary

dev.Lee·2022년 8월 28일
0
post-thumbnail

리트코드의 184번 문제 Department Highest Salary를 윈도우 함수를 사용해 풀어보았다.

데이터리안 강좌를 들으면서 자주 등장한 연습 문제라 문제는 이제 아주 익숙하다.
주어진 테이블에서 각 부서(Department)마다 임금(Salary)가 가장 높은 사람(Employee)를 찾는 문제이다.
Department, Employee, Salary 형태의 테이블로 출력하면 된다.

WHERE 서브쿼리에 윈도우함수, FROM 서브쿼리에 윈도우함수를 사용해 총 두 가지 풀이를 하였다.

WHERE 서브쿼리 + 윈도우함수

  • Department id를 기준으로 INNER JOIN하여 출력을 위한 Department 이름을 가져온다.
  • Department 테이블을 보면 부서가 id 1번 IT, id 2번 Sales 두 개이다.
    그러므로 WHERE 절에서 부서 id 1일때와 부서 id 2일때 각각 윈도우함수를 사용해 각 부서 별 MAX(Salary)를 구한다.

위 내용을 작성한 쿼리는 아래와 같다.

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 절 서브쿼리로 바꿔 풀었다.

FROM 서브쿼리 + 윈도우함수

  • FROM 서브쿼리에서 MAX() 윈도우함수로 부서 별 가장 높은 salary를 구한다.
    동일 부서 내 사람들의 Salary 중 가장 큰 Salary가 표시되는 Max_Salary 열이 새로 생긴다.
  • Department id를 기준으로 INNER JOIN하여 출력을 위한 Department 이름을 가져온다.
  • WHERE절에서 Salary = Max_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 Max_Salary
     FROM Employee) e
     INNER JOIN Department d
     ON e.DepartmentId = d.Id
WHERE e.Salary = e.Max_Salary

이 풀이는 첫 번째 풀이처럼 일일이 Max Salary를 구하는 방법이 아니고
또 만약 특정 부서는 계산에서 제외하겠다던지 추가 조건을 붙일 때도 유연하게 수정할 수 있어 좀 더 확장성이 좋은 코드이다. 바로 두 번째같은 풀이를 생각해낼 수 있도록 훈련해야겠다 ㅠ

profile
백지를 벗어나고 싶은 학생

0개의 댓글

관련 채용 정보