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 테이블과 결합해서 부서코드를 부서명으로 변경해주면 완료!
테이블 내의 열의 이름들이 비슷해서 헷갈리는 문제였다.
'코딩일기' 카테고리의 다른 글
SQL 코드카타 121 - Patients With a Condition (0) | 2024.07.14 |
---|---|
SQL 코드카타 120 - Fix Names in a Table (0) | 2024.07.14 |
알고리즘 코드카타 54 - 2016년 (복습) (0) | 2024.07.12 |
SQL 코드카타 118 - Investments in 2016 (0) | 2024.07.12 |
SQL 코드카타 117 - Friend Requests II: Who Has the Most Friends (0) | 2024.07.12 |