📝 184. Department Highest Salary
🔹 부서 최고 연봉
각 부서에서 가장 높은 급여를 받는 직원을 찾는 솔루션을 작성하세요.
어떤 순서로든 결과 테이블을 반환합니다.
📝 문제 설명
- 각 부서별로 최고 연봉을 받는 직원을 찾아야 합니다.
- 부서별로 연봉이 가장 높은 직원이 여러 명일 수도 있습니다.
- 결과에는 부서 이름, 직원 이름, 연봉이 포함되어야 합니다.
📊 테이블 구조
Employee 테이블
Column Name | Type |
id | int |
name | varchar |
salary | int |
departmentId | int |
Department 테이블
Column Name | Type |
id | int |
name | varchar |
💡 SQL 문제 해결 방법
- 각 부서별 최고 연봉을 찾기 위해 DENSE_RANK() 함수 사용
- DENSE_RANK() OVER(PARTITION BY departmentId ORDER BY salary DESC)
- 같은 부서 내에서 연봉이 높은 순서대로 순위를 매깁니다.
- 동점자가 있을 경우 같은 순위를 부여합니다.
- 부서별 1위(최고 연봉) 직원만 선택
- WHERE rnk = 1 조건을 사용하여 최고 연봉을 받는 직원만 가져옵니다.
- 부서 정보와 조인
- Department 테이블과 LEFT JOIN을 사용하여 부서 이름을 가져옵니다.
728x90
🖥️ SQL 풀이
WITH salary_rank AS (
SELECT *
, DENSE_RANK() OVER(PARTITION BY departmentId ORDER BY salary DESC) AS rnk
FROM Employee
)
SELECT d.name AS Department
, e.name AS Employee
, e.salary
FROM salary_rank e
LEFT JOIN Department d
ON e.departmentId = d.id
WHERE rnk = 1;
🔍 쿼리 분석
- WITH salary_rank AS (...)
- 부서별로 급여 순위를 매깁니다.
- DENSE_RANK()를 사용하여 같은 급여인 경우 같은 순위를 부여합니다.
- PARTITION BY departmentId ORDER BY salary DESC → 부서별 급여 내림차순 정렬
- 최고 연봉 직원만 필터링
- WHERE rnk = 1 → 각 부서에서 최고 연봉을 받는 직원만 선택
- 부서 이름 가져오기
- LEFT JOIN Department d ON e.departmentId = d.id
- 부서 ID를 기준으로 Department 테이블과 조인하여 부서 이름을 추가
📌 실행 예제
📊 입력 데이터
Employee 테이블
id | name | salary | departmentId |
1 | Joe | 70000 | 1 |
2 | Jim | 90000 | 1 |
3 | Henry | 80000 | 2 |
4 | Sam | 60000 | 2 |
5 | Max | 90000 | 1 |
Department 테이블
id | name |
1 | IT |
2 | Sales |
쿼리 실행 결과
Department | Employee | Salary |
IT | Jim | 90000 |
Sales | Henry | 80000 |
IT | Max | 90000 |
- IT 부서 직원들 중 최고 연봉인 90000을 받는 Jim, Max를 둘 다 출력합니다.
- Sales 부서 직원들 중 최고 연봉인 80000을 받는 Henry를 출력합니다.
🎯 결론
이 문제는 부서별 최고 연봉을 찾는 방법을 익히는 좋은 문제입니다.
특히, DENSE_RANK() 윈도우 함수를 활용하여 부서별 연봉 순위를 매기고, 최고 연봉을 가진 직원만 추출하는 것이 핵심입니다.
다른 방식으로 MAX(salary)를 사용하여 구할 수도 있지만, DENSE_RANK()는 중복 연봉도 올바르게 처리할 수 있다는 장점이 있습니다.
이 개념을 이해하면 부서별 최고 성과자, 부서별 최대 매출 고객 같은 문제도 쉽게 해결할 수 있습니다! 😊
더 많은 SQL 문제 풀이를 보고 싶다면 LeetCode SQL 문제 모음을 확인해 보세요! 🚀
728x90
반응형
'LeetCode' 카테고리의 다른 글
[LeetCode] 1158. Market Analysis 1 (0) | 2025.04.16 |
---|---|
[LeetCode] 608. Tree Node (0) | 2025.04.16 |
[LeetCode] 178. Rank Scores (0) | 2025.03.20 |
[LeetCode] 177. Nth Highest Salary (0) | 2025.03.20 |
[LeetCode] 1965. Employees With Missing Information (0) | 2025.03.18 |