출처: 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;