본문 바로가기

[LeetCode] 184. Department Highest Salary

by qwee0328 2025. 3. 26.

📝 184. Department Highest Salary

🔹 부서 최고 연봉

각 부서에서 가장 높은 급여를 받는 직원을 찾는 솔루션을 작성하세요.
어떤 순서로든 결과 테이블을 반환합니다.

 

 

📝 문제 설명

  1. 부서별최고 연봉을 받는 직원을 찾아야 합니다.
  2. 부서별로 연봉이 가장 높은 직원이 여러 명일 수도 있습니다.
  3. 결과에는 부서 이름, 직원 이름, 연봉이 포함되어야 합니다.

 

📊 테이블 구조

Employee 테이블

Column Name Type
id int
name varchar
salary int
departmentId int

 

Department 테이블

Column Name Type
id int
name varchar

 

 

💡 SQL 문제 해결 방법

  1. 각 부서별 최고 연봉을 찾기 위해 DENSE_RANK() 함수 사용
    • DENSE_RANK() OVER(PARTITION BY departmentId ORDER BY salary DESC)
    • 같은 부서 내에서 연봉이 높은 순서대로 순위를 매깁니다.
    • 동점자가 있을 경우 같은 순위를 부여합니다.
  2. 부서별 1위(최고 연봉) 직원만 선택
    • WHERE rnk = 1 조건을 사용하여 최고 연봉을 받는 직원만 가져옵니다.
  3. 부서 정보와 조인
    • 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