[LeetCode] 185. Department Top Three Salaries

2025. 3. 10. 15:07SQL

🔗 문제 링크

https://leetcode.com/problems/department-top-three-salaries/description/?envType=study-plan-v2&envId=top-sql-50

 

🔓 문제 풀이

WITH tb AS (
    SELECT 
        d.name AS Department,
        e.name AS Employee,
        e.id,
        DENSE_RANK() OVER (PARTITION BY e.departmentId ORDER BY e.Salary DESC) AS rank_salary
    FROM 
        Employee e
    JOIN 
        Department d ON e.departmentId = d.id
)
SELECT 
    t.Department,
    t.Employee,
    e.salary 
FROM 
    tb t 
JOIN 
    Employee e ON t.id = e.id 
WHERE 
    t.rank_salary <= 3
ORDER BY 
    t.Department, e.salary DESC;

회사에서 자주 사용하는 쿼리라 풀기 쉬웠다.
부서별로 월급 상위 3위까지 구한다.(여기서 급여가 동일한 직원이 있을 경우 모두 출력해야 한다.)

dense_rank(동일값에 대해 같은 순위) 윈도우 함수를 이용해서 부서별 월급 순위를 구한뒤,
기존 Employee와 join 하여 부서별 상위 3위의 월급을 받는 직원을 모두 구한다.

 

✅ 사용 문법 정리

DENSE_RANK()와 RANK()는 순위를 구하는 윈도우 함수입니다. .

  • **DENSE_RANK()**는 중복된 순위 후에도 순위가 연속적으로 부여됩니다. 예: 100, 90, 90, 80, 70 → 1, 2, 2, 3, 4
  • **RANK()**는 중복된 순위 후에 순위가 건너뜁니다. 예: 100, 90, 90, 80, 70 → 1, 2, 2, 4, 5

즉, DENSE_RANK()는 순위가 끊기지 않고, RANK()는 순위에 갭이 생깁니다.

 

'SQL' 카테고리의 다른 글

[LeetCode] 262. Trips and Users  (0) 2025.03.11
[LeetCode] 3451. Find Invalid IP Addresses  (0) 2025.03.10
[SQL] 연습 문제 모음5  (0) 2025.03.10
[SQL] 문제 풀이 모음4  (0) 2025.03.06
[SQL] 연습 문제 모음3  (0) 2025.03.04