Coding/SQL
[LeetCode-SQL 50] 626. Exchange Seats
kangplay
2025. 3. 4. 16:01
문제
https://leetcode.com/problems/department-top-three-salaries

설명
부서별 상위 3개의 급여를 구한 후, 해당 급여를 가진 직원 정보를 출력하는 문제이다.
윈도우 함수를 이용하면, 원하는 컬럼을 기준으로 구분한 뒤, 순위를 정할 수 있다.
또한, DENSE_RANK는 RANK와는 다르게 중복된 값이 있으면 포함하고 다음 순위를 건너뛰지 않고 순위를 매긴다.
ROW_RANK는 중복된 값이 있으면 동률이 아닌 다른 순위를 매긴다.
📌 윈도우 함수 생김새
함수(컬럼1) OVER (Partition by 컬럼2 Order by 컬럼3)
- 컬럼 2에 따라 나눈 후, 컬럼 3을 기준으로 순위를 정한다. 또한, LAG, LEAD 등의 함수는 컬럼 1을 기준으로 직전, 직후 컬럼을 구한다.
- group by 와는 다르게, 행의 수가 그대로 유지되므로 행과 행 간의 관계를 편하게 다룰 수 있다.
구현
# Write your MySQL query statement below
with SALARY_RANK as
(
select e.departmentId as departmentId, name, salary, DENSE_RANK() OVER (PARTITION BY e.departmentId ORDER BY salary desc) as salary_rank
from Employee e
)
select d.name as Department, sr.name as Employee, sr.salary as Salary
from SALARY_RANK sr join Department d on sr.departmentId = d.id
where sr.salary_rank <= 3;