[LeetCode] 185. Department Top Three Salaries
2025. 3. 10. 15:07ㆍSQL
🔗 문제 링크
🔓 문제 풀이
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 |