본문 바로가기

SQL/LeetCode&HackerRank

[MySQL] LeetCode 184 - 서브쿼리와 이너 조인 활용하기

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

문제: 각 부서에서 가장 높은 급여를 받는 사람의 소속 부서, 이름, 급여 금액을 찾아라

 

풀이:

먼저 각 부서별로 가장 높은 급여를 찾는다.

SELECT departmentID
     , MAX(salary) AS Salary
FROM Employee
GROUP BY departmentID

결과

| departmentID | Salary |
| ------------ | ------ |
| 1            | 90000  |
| 2            | 80000  |

 

그 다음, 위 결과에 부합하는(해당 부서에서 가장 높은 급여를 받는) 사람을 추출해야 한다.

그렇게 하기 위해서는

위 결과를 테이블 처럼 사용할 수 있게 서브쿼리로 가져와서 Employee 테이블과 이너조인을 하면 된다.

이때 이너조인을 하는 기준은 departmenId와 salary다.

이너조인을 하면 두 개의 테이블에서 기준 값이 서로 일치하는 데이터만 남기 때문에

조건을 만족하는 사람을 추출할 수 있다! 

 

 

그리고 이때 서브쿼리에 별칭도 달아주어야 한다!

안 달면

Every derived table must have its own alias.

라는 에러가 난다

 

그렇게 서브쿼리와 이너조인 하기

SELECT *
FROM Employee AS e
    INNER JOIN(
        SELECT departmentId
             , MAX(salary) AS Salary
        FROM Employee
        GROUP BY departmentId
    ) AS hs -- alias 필수
    ON e.departmentId = hs.departmnedId

 

 결과

| id | name  | salary | departmentId | departmentId | Salary |
| -- | ----- | ------ | ------------ | ------------ | ------ |
| 2  | Jim   | 90000  | 1            | 1            | 90000  |
| 3  | Henry | 80000  | 2            | 2            | 80000  |
| 5  | Max   | 90000  | 1            | 1            | 90000  |

서브쿼리 테이블과 departmentId와 salary가 일치하는 employee 데이터만 남았다.

이제 최종 아웃풋에서 원하는 모양으로 바꿔주면 된다.

 

departmentid에 상응하는 부서 이름을 가져오기 위해 department 테이블을 이너조인 해주고,

원하는 컬럼만 가져오면 된다.

SELECT d.name AS Department
     , e.name AS Employee
     , hs. Salary
FROM Employee AS e
    INNER JOIN(
        SELECT departmentId
             , MAX(salary) AS Salary
        FROM Employee
        GROUP BY departmentId
    ) AS hs ON e.departmentId = hs.departmentId
            AND e.salary = hs.Salary
    INNER JOIN Department AS d ON d.id = e.departmentId

 

최종 결과

| Department | Employee | Salary |
| ---------- | -------- | ------ |
| IT         | Jim      | 90000  |
| Sales      | Henry    | 80000  |
| IT         | Max      | 90000  |

 

본 내용은 데이터리안 'SQL 데이터 분석 캠프 실전반' 을 수강하며 작성한 내용입니다.