[오늘의 문제] Department Highest Salary

shlim55·2026년 1월 16일

코딩테스트

목록 보기
218/223

출처: https://leetcode.com/problems/department-highest-salary/

테이블:Employee

+--------------+---------+
| 열 이름 | 유형 |
+--------------+---------+
| ID | 정수 |
| 이름 | varchar |
| 급여 | 내부 |
| 부서 ID | 정수 |
+--------------+---------+
id는 이 테이블의 기본 키(고유 값을 가진 열)입니다.
departmentId는 테이블의 ID를 참조하는 외래 키(참조 열)입니다 Department .
이 표의 각 행은 직원의 ID, 이름, 급여를 나타냅니다. 또한 해당 직원이 소속된 부서의 ID도 포함되어 있습니다.

테이블:Department

+-------------+---------+
| 열 이름 | 유형 |
+-------------+---------+
| ID | 정수 |
| 이름 | varchar |
+-------------+---------+
id는 이 테이블의 기본 키(고유 값을 가진 열)입니다. 부서 이름은 고유하지 않음이 보장됩니다.NULL.
이 표의 각 행은 부서의 ID와 부서 이름을 나타냅니다.

각 부서에서 가장 높은 급여를 받는 직원을 찾는 솔루션을 작성하세요.

결과 테이블을 어떤 순서 로든 반환합니다 .

결과 형식은 다음 예시와 같습니다.

예시 1:

입력:
직원 목록:
+----+-------+--------+--------------+
| ID | 이름 | 급여 | 부서 ID |
+----+-------+--------+--------------+
| 1 | 조 | 70000 | 1 |
| 2 | 짐 | 90000 | 1 |
| 3 | 헨리 | 80000 | 2 |
| 4 | 샘 | 60000 | 2 |
| 5 | 최대 | 90000 | 1 |
+----+-------+--------+--------------+
부서별 표:
+----+-------+
| ID | 이름 |
+----+-------+
| 1 | IT |
| 2 | 판매 |
+----+-------+
산출:
+------------+----------+--------+
| 부서 | 직원 | 급여 |
+------------+----------+--------+
| IT | 짐 | 90000 |
| 판매 | 헨리 | 80000 |
| IT | 맥스 | 90000 |
+------------+----------+--------+
설명: 맥스와 짐은 IT 부서에서 가장 높은 연봉을 받고 있으며, 헨리는 영업 부서에서 가장 높은 연봉을 받고 있습니다.

내가 한 풀이

SELECT d.name AS Department, e.name AS Employee, e.salary 
FROM Employee e 
JOIN Department d  
ON e.departmentId = d.id
GROUP BY d.id
ORDER BY e.salary DESC

트러블 슈팅

일단 그룹바이 만으로는 절대

각 그룹별 연봉 제일 많이 받는 사람을 출력 못한다.

Window 함수 쓴 풀이

SELECT Department, Employee, salary
FROM (
    SELECT 
        d.name AS Department, 
        e.name AS Employee, 
        e.salary,
        RANK() OVER (PARTITION BY d.id ORDER BY e.salary DESC) as rnk
    FROM Employee e 
    JOIN Department d ON e.departmentId = d.id
) temp
WHERE rnk = 1;

PARTITION BY d.id: 부서별로 그룹을 나눈다.

ORDER BY e.salary DESC: 연봉이 높은 순서대로 줄을 세운다.

RANK() ... as rnk: 각 부서 내에서 1등부터 번호를 매긴다.

WHERE rnk = 1: 마지막에 각 부서 1등만 골라낸다.

CTE 함수를 쓴 풀이

WITH RankedSalary AS (
    SELECT 
        d.name AS Department, 
        e.name AS Employee, 
        e.salary,
        DENSE_RANK() OVER (PARTITION BY d.id ORDER BY e.salary DESC) as rnk
    FROM Employee e 
    JOIN Department d ON e.departmentId = d.id
)
SELECT Department, Employee, salary
FROM RankedSalary
WHERE rnk = 1;
profile
A Normal Programmer

0개의 댓글