오랑우탄의 반란

LeetCode 리트코드 | 185. Department Top Three Salaries (MySQL) DENSE_RANK 본문

SQL/LeetCode

LeetCode 리트코드 | 185. Department Top Three Salaries (MySQL) DENSE_RANK

5&2 2024. 8. 8. 08:04
반응형

 


오늘도 오랑이는 
문제를 풉니다.

 

185. Department Top Three Salaries

 

풀이 과정

  • 각 부서별로 월급 순위 매기기 dense_rank
  • 순위가 3 이하인 사람 select

윈도우 함수로 순위 추출하는 방법을 알면 간단한 문제입니다.

추출할 칼럼과 부서별 월급이 큰 순으로 정렬해 순위를 추출해주는 칼럼을 select 합니다. 

select d.name as Department, e.name Employee, Salary, 
    dense_rank() over (partition by d.name order by salary desc) as rn
from employee e join department d on departmentId = d.id

 

RANK vs DENSE_RANK

RANK 함수를 사용할 경우, 동일 salary에 대해 같은 순위가 매겨지지만 그 다음 순위를 건너뛰기 때문에 순위가 만약에 1, 2, 2, 4 일 경우 앞에 1, 2, 2 만 추출되지만 이 문제에서 요구하는 것은 unique 한 월급 즉 rank 4까지 포함되는 것이기 때문에 적절하지 않습니다. 

반면 DENSE_RANK 는 1, 2, 2, 3 으로 동일 순위에도 다음 순위를 건너뛰지 않기에 이 문제에 적절합니다. 

 

앞서 작성한 쿼리에서 실제 rn 칼럼은 필요가 없고, rn 이 3이하인 나머지 칼럼들만 필요하기 때문에 서브쿼리로 넣어주고 where rn <= 3 조건으로 묶어줍니다. 

 

최종 코드

select Department, Employee, Salary
from (
    select d.name as Department, e.name Employee, Salary, 
        dense_rank() over (partition by d.name order by salary desc) as rn
    from employee e join department d on departmentId = d.id
) a
where rn <= 3

 

CTE로 풀 수도 있습니다.

with cte as (
    select *, dense_rank() over (partition by departmentid order by salary desc) as rn from employee
)
select d.name as Department, cte.name as Employee, salary
from cte join department d on cte.departmentid = d.id
where rn <=3

 

 

 



오랑우탄이 영어를 하고 오랑이가 쿼리마스터가 되는 그날까지~

 

 

https://leetcode.com/problems/department-top-three-salaries/description/

 

 

반응형