[LeetCode/Oracle] 185. Department Top Three Salaries

songeunm·2025년 5월 8일

PS - sql

목록 보기
58/58
post-thumbnail

hard / 185. Department Top Three Salaries

문제 흐름

이번 문제는 특별히 Oracle을 이용해 해결했다.
며칠동안은 코테 덕에 Oracle에 적응하는 것을 목표로 하고있다.


문제에서 특별한 부분은 없었다.

A company's executives are interested in seeing who earns the most money in each of the company's departments. A high earner in a department is an employee who has a salary in the top three unique salaries for that department.
Write a solution to find the employees who are high earners in each of the departments.
Return the result table in any order.

각 부서별로 급여가 3번째로 높은 사람까지 출력하면 되는데, 예제 출력을 보면 알 수 있듯이 급여가 동일할 경우 함께 출력해야한다.
여기서 떠오르는 윈도우 함수가 세가지 있다.
간단하게 각 특성을 정리했다.

  • row_number: 동일한 수치에 대해 각각의 순위를 부여 (진짜 행 번호)
  • rank: 동일한 수치라면 건너뛰어 순위를 부여 (공동 1위라면 1위 없이 2위가 2명)
  • dense_rank: 동일한 수치에 건너뛰지 않고 순위를 부여 (공동 1위라면 1위가 2명)

이 문제에서 사용하기 가장 편리해보이는 것은 dense_rank였다.
CTE를 통해 dense_rank를 적용하여 각 부서별 급여를 내림차순으로 순위를 매긴 뒤,
메인 쿼리에서 순위가 3 이상인 사람들을 추출했다.
따로 정렬은 필요없기에 하지 않았다.


여기서부터는 Oracle을 사용하면서 느꼈던 점인데,
아마 자연스럽게 계속 틀렸던걸 보면 MySQL과 Oracle의 차이점인듯하다.

MySQL에서는 테이블을 join한 뒤 *을 선택하면
컬럼명이 동일할 경우 각 테이블 엘리어스가 앞에 붙은 컬럼명인 e.id와 같은 방식으로 저장되는걸로 안다.
하지만 Oracle은 그저 컬럼명만 뽑기 때문에 embiguous하게 된다.
따라서 컬럼 이름 지정에 조금 더 주의를 기울여야 하는 느낌이 들었다.

코드

WITH rank_table AS (
SELECT e.*, d.name department,
    dense_rank() OVER(partition by departmentId order by salary desc) salary_rank
FROM employee e
LEFT JOIN department  d ON e.departmentId = d.id
)

SELECT department "Department", name "Employee", salary "Salary"
FROM rank_table
WHERE salary_rank <= 3;
profile
데굴데굴 구르는 개발자 지망생

0개의 댓글