Today I Learned/SQL 문제풀이

[leetcode] Department Highest Salary (윈도우함수)

하나719 2020. 11. 21. 11:31
반응형

문제 출처: leetcode.com/problems/department-highest-salary/

 

Department Highest Salary - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

문제. 각 부서에서 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번 솔루션이 확장 가능성면에서 더 나은 코드이다.

 

 

반응형