본문 바로가기

코딩일기

SQL 코드카타 119 - Department Top Three Salaries

https://leetcode.com/problems/department-top-three-salaries/description/

 

Column Name Type
id int
name varchar
salary int
departmentId int

 

Employee 테이블:

  • id: 테이블의 고유 키
  • name   : 직원의 이름
  • salary : 직원의 급여
  • departmentId : Department 테이블의 ID

 

Column Name Type
id int
name varchar

Department 테이블:

  • id: 테이블의 고유 키
  • name : 부서의 이름

회사의 임원들은 회사의 각 부서에서 가장 많은 급여를 받는 직원을 보고 싶어 합니다. 각 부서에서의 고수익자는 그 부서의 상위 세 개의 고유한 급여 중 하나를 받는 직원입니다.

각 부서에서 고수익자인 직원들을 찾는 해결책을 작성하세요.

 

select
    name,
    salary,
    departmentId,
    rank() over (partition by departmentId order by salary desc) rank_salary
from Employee

 

먼저 부서별로 급여의 순위를 표시해준다.

 

select
    name,
    salary,
    departmentId,
    rank() over (partition by departmentId order by salary desc) rank_salary
from Employee
group by salary, departmentId

 

이때, 부서별로 동점자의 순위를 표시하기 위해서 부서별, 월급별로 그룹화하여 순위를 표시한다.(추후에 join해서 표기해줄 예정)

 

select *
from Employee e
left join (select
    name,
    salary,
    departmentId,
    rank() over (partition by departmentId order by salary desc) rank_salary
from Employee
group by salary, departmentId) r on e.salary = r.salary and e.departmentId = r.departmentId

 

Employee 테이블과 그룹화해서 각 직원의 부서별 급여의 순위를 표시해준다. 이때, 다른 부서지만 월급이 같은 직원이 있을 수 있으므로 JOIN 조건을 부서별로 같은 월급을 가진 직원으로 설정한다.

 

select
    e.departmentId,
    e.name,
    e.salary
from Employee e
left join (select
    name,
    salary,
    departmentId,
    rank() over (partition by departmentId order by salary desc) rank_salary
from Employee
group by salary, departmentId) r on e.salary = r.salary and e.departmentId = r.departmentId
where r.rank_salary <= 3

 

서브쿼리에서 구한 rank_salary가 3 이하인 직원(= 부서별로 급여가 3위 안에 드는 직원)을 필터링 한 후 필요한 데이터만 출력해준다.

 

select
    d.name Department,
    r.name Employee,
    r.salary Salary
from
(select
    e.departmentId,
    e.name,
    e.salary
from Employee e
left join (select
    name,
    salary,
    departmentId,
    rank() over (partition by departmentId order by salary desc) rank_salary
from Employee
group by salary, departmentId) r on e.salary = r.salary and e.departmentId = r.departmentId
where r.rank_salary <= 3) r
left join Department d on r.departmentId = d.id

 

마지막으로 Department 테이블과 결합해서 부서코드를 부서명으로 변경해주면 완료!

성공!

 

 

테이블 내의 열의 이름들이 비슷해서 헷갈리는 문제였다.