오랑우탄의 반란
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/
반응형
'SQL > LeetCode' 카테고리의 다른 글
LeetCode | 1484. Group Sold Products By The Date (MySQL) GROUP_CONCAT 그룹별 행 한줄에 출력 (0) | 2024.08.19 |
---|---|
LeetCode 리트코드 | 602. Friend Requests II: Who Has the Most Friends (MySQL) (0) | 2024.08.07 |
LeetCode 리트코드 | 1321. Restaurant Growth (MySQL) (0) | 2024.08.05 |
LeetCode 리트코드 | 1341. Movie Rating (MySQL) (0) | 2024.08.02 |
LeetCode 리트코드 | 626. Exchange Seats (MySQL) CASE, LAG/LEAD, ROW_NUMBER (0) | 2024.08.01 |