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;