본문 바로가기

Algorithm/MySQL

[LeetCode] 185. Department Top Three Salaries (MySQL)

문제

  • 부서 별 고소득자 구하기
  • 해당 부서의 top 3에 해당하는 급여를 받는 직원 구하기

코드

1. 부서 별 고소득자를 구해야하기 때문에 순위 정하는 함수 DENSE_RANK() 사용

top3에 해당하는 직원이 아니라 top3 급여를 받는 직원을 구하면 되기 때문에 DENSE_RANK()를 사용했다.
DENSE_RANK()와 RANK() 차이점은 RANK()는 2명이 90000이고 90000이 max값이면 둘 다 1위가 되고 다음 순위가 3위가 되는데 DENSE_RANK()는 1위가 2번이면 둘 다 1위가 되고 그 다음 순위는 2위가 된다.

SELECT departmentId
     , name
     , salary
     , DENSE_RANK() OVER (partition by departmentId ORDER BY salary DESC) as dr
From Employee
group by departmentId, name, salary

# [1, "Max", 90000, 1], 
# [1, "Joe", 85000, 2], 
# [1, "Randy", 85000, 2],
# [1, "Will", 70000, 3], 
# [1, "Janet", 69000, 4],
# [2, "Henry", 80000, 1],
# [2, "Sam", 60000, 2]

2. 이 중에서 dr이 1위부터 3위인 데이터를 보여줘야하기 때문에 위 쿼리를 FROM절에 넣어주고 where 조건에 a.dr <=를 써준다

select d.name as Department
     , a.name as Employee
     , a.salary as Salary
from (
    SELECT departmentId
         , name
         , salary
         , DENSE_RANK() OVER (partition by departmentId ORDER BY salary DESC) as dr
    From Employee
    group by departmentId, name, salary
    ) a 
    INNER JOIN department d ON d.id = a.departmentId
where a.dr <= 3

# ["IT", "Max", 90000], -- 1 
# ["IT", "Joe", 85000], -- 2
# ["IT", "Randy", 85000], -- 2
# ["IT", "Will", 70000],  -- 3
# ["Sales", "Henry", 80000], -- 1
# ["Sales", "Sam", 60000] -- 2

출처

반응형