Employees 테이블:
| EmployeeID | Name | Department | Salary | ManagerID |
|---|---|---|---|---|
| 1 | Alice | HR | 70000 | NULL |
| 2 | Bob | IT | 90000 | 1 |
| 3 | Charlie | IT | 80000 | 2 |
| 4 | David | IT | 85000 | 2 |
| 5 | Eve | HR | 75000 | 1 |
| 6 | Frank | Finance | 95000 | NULL |
| 7 | Grace | Finance | 80000 | 6 |
| 8 | Heidi | IT | 95000 | 2 |
| Name | Department | Salary | Top_Earner | Top_Salary |
|---|---|---|---|---|
| Alice | HR | 70000 | Eve | 75000 |
| Bob | IT | 90000 | Heidi | 95000 |
| Charlie | IT | 80000 | Heidi | 95000 |
| David | IT | 85000 | Heidi | 95000 |
| Eve | HR | 75000 | Eve | 75000 |
| Frank | Finance | 95000 | Frank | 95000 |
| Grace | Finance | 80000 | Frank | 95000 |
| Heidi | IT | 95000 | Heidi | 95000 |
select e.Name , e.Department , e.Salary , b.Name Top_Earner, b.Salary Top_Salary
from
(
select Department , Name, Salary
from
(
select Department , Name, Salary, Rank() over(partition by Department order by Salary desc) ranking
from employees e
) a
where ranking = 1
) b join employees e on b.Department = e.Department
첫번째 서브쿼리에서 department내에서 salary가 높은 순으로 랭킹을 매길 수 있도록 쿼리를 작성해주었다.
두번째 서브쿼리에서는 랭킹이 1위인 데이터, 즉 salary가 가장 많은 경우만 결과값으로 남기도록 하였고,
마지막으로 department별로 salary가 가장 많은 경우만 남은 테이블과 employees 테이블을 join 하여, 각 테이블에서 필요한 컬럼의 데이터를 select하도록 쿼리를 작성했다.
기대결과
| Department | Avg_Salary |
|---|---|
| IT | 87500 |
내가 작성한 쿼리 :
select Department , avg(Salary) avg_salary
from employees e
group by 1
order by 2 desc
limit 1
부서별 샐러리의 평균을 구하고, 평균 월급 값이 큰 순서로 정렬한 뒤, 가장 첫번째 행만 남도록 쿼리를 작성했다.