Algorithm/MySQL
[LeetCode] 185. Department Top Three Salaries (MySQL)
yujin.me
2021. 7. 14. 21:09
문제
- 부서 별 고소득자 구하기
- 해당 부서의 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
출처
반응형