부서별 최고 연봉자
그룹별 상위 N개 급여 문제를 위해 파티션과 순위 매기기를 결합합니다.
부서별 최고 연봉자은(는) CoddyKit의 무료 SQL Interview Prep 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
전역 순위에서 그룹별 순위로
다음 단계의 질문은 "각 부서에서 가장 높은 급여를 받는 직원을 찾으세요"입니다. 이 문제는 순위와 그룹화를 결합하며, 중급 수준에서 반드시 나오는 질문입니다.
id, name, department_id, salary 열이 있는 employee 테이블을 가정하겠습니다. 전역 최댓값 하나가 아니라 부서별 최고 급여 직원 한 명(동률이면 여러 명)을 원합니다.
새롭게 사용할 핵심 도구는 PARTITION BY입니다. 이 도구를 사용하면 각 부서 안에서 순위를 다시 시작합니다.
CREATE TABLE employee (
id INT PRIMARY KEY,
name VARCHAR(100),
department_id INT,
salary INT
);PARTITION BY가 순위를 다시 시작하는 방식
윈도 함수에 PARTITION BY department_id를 추가하면 데이터베이스가 각 부서 안에서 독립적으로 순위를 계산합니다.
각 부서는 자체적인 순위 1에서 시작합니다. 따라서 부서 1의 최고 급여 직원과 부서 5의 최고 급여 직원이 모두 순위 1을 받습니다. 분할하지 않으면 전역 최댓값 하나만 순위 1을 받습니다.
SELECT name, department_id, salary,
DENSE_RANK() OVER (
PARTITION BY department_id
ORDER BY salary DESC
) AS rnk
FROM employee;순위 1만 필터링하기
최고 급여 직원만 남기려면 순위를 매긴 쿼리를 감싼 뒤 순위 1을 필터링합니다. 항상 그렇듯이, 윈도 함수는 필터링하기 전에 서브쿼리나 CTE에서 계산해야 합니다.
여기서 DENSE_RANK(또는 RANK)를 사용하면 한 부서에서 두 직원의 급여가 최고 수준으로 동률일 때 두 직원 모두 반환됩니다. 이는 일반적으로 "최고 급여 직원"을 해석하는 올바른 방식입니다.
SELECT name, department_id, salary
FROM (
SELECT name, department_id, salary,
DENSE_RANK() OVER (
PARTITION BY department_id
ORDER BY salary DESC
) AS rnk
FROM employee
) t
WHERE rnk = 1;정확히 하나가 필요할 때의 ROW_NUMBER
면접관이 동률이 있더라도 부서마다 정확히 한 행을 원할 때가 있습니다. 그런 경우 ROW_NUMBER를 사용하고 가장 작은 식별자와 같은 결정적인 동률 해소 기준을 추가하십시오.
동률 해소 기준이 없으면 동률이 임의로 처리되어 결과가 비결정적이 됩니다. , id ASC를 추가하면 선택 결과를 반복해서 동일하게 얻을 수 있습니다.
SELECT name, department_id, salary
FROM (
SELECT name, department_id, salary,
ROW_NUMBER() OVER (
PARTITION BY department_id
ORDER BY salary DESC, id ASC
) AS rn
FROM employee
) t
WHERE rn = 1;여기서 DENSE_RANK와 ROW_NUMBER와 RANK 비교
정확한 문구를 기준으로 선택하십시오.
- DENSE_RANK = 1: 부서별로 가장 높은 급여를 받아 동률인 모든 직원입니다.
- RANK = 1: 최상위 순위에서는 DENSE_RANK와 동일합니다(순위 1 아래에서만 순위 건너뛰기가 의미가 있습니다).
- ROW_NUMBER = 1: 부서마다 정확히 한 명의 직원만 반환하며, 동률은 ORDER BY 기준으로 결정됩니다.
어떤 것을 선택했고 그 이유가 무엇인지 설명하는 부분을 면접관이 평가합니다.
윈도 함수 이전의 상관 서브쿼리 방식
윈도 함수가 없던 시절의 표준 해법은 상관 서브쿼리였습니다. 같은 부서에서 자신보다 더 많이 버는 사람이 없을 때만 행을 유지하는 방식입니다.
이 방식은 동률인 최고 급여 수령자를 자연스럽게 모두 반환합니다. 이식성이 높지만, 쿼리 최적화기가 다시 작성하지 않는 한 내부 MAX가 외부 행마다 평가될 수 있어 느릴 수 있습니다.
SELECT e.name, e.department_id, e.salary
FROM employee e
WHERE e.salary = (
SELECT MAX(e2.salary)
FROM employee e2
WHERE e2.department_id = e.department_id
);GROUP BY 조인 방식
또 다른 이식성 높은 패턴은 GROUP BY로 부서별 최고 급여를 계산한 다음, 다시 조인하여 일치하는 직원들을 가져오는 것입니다.
효율적이고 명확한 방식입니다. 조인을 통해 급여가 해당 부서의 최고 급여와 같은 모든 직원이 다시 조회되므로 동률도 유지됩니다.
SELECT e.name, e.department_id, e.salary
FROM employee e
JOIN (
SELECT department_id, MAX(salary) AS max_sal
FROM employee
GROUP BY department_id
) m
ON e.department_id = m.department_id
AND e.salary = m.max_sal;부서별 상위 N개
이 패턴은 새로운 개념 없이 "부서별 상위 급여 수령자 3명"으로 확장할 수 있습니다. 필터를 범위로 바꾸기만 하면 됩니다.
DENSE_RANK를 사용하면 rnk <= 3이 서로 다른 상위 급여 수준 세 개를 반환합니다(동률이 있으면 행이 세 개보다 많을 수 있습니다). ROW_NUMBER를 사용하면 rn <= 3이 부서마다 정확히 세 행을 반환합니다.
SELECT name, department_id, salary
FROM (
SELECT name, department_id, salary,
DENSE_RANK() OVER (
PARTITION BY department_id
ORDER BY salary DESC
) AS rnk
FROM employee
) t
WHERE rnk <= 3;예제
부서 1: Ana 120, Bob 120, Cara 90. 부서 2: Dan 200, Eve 150.
- DENSE_RANK = 1: 부서 1의 Ana(120), Bob(120), 부서 2의 Dan(200)입니다. 총 세 행입니다.
- 식별자를 동률 해소 기준으로 사용한 ROW_NUMBER = 1: Ana와 Bob 중 식별자가 더 낮은 한 명과 Dan이 반환됩니다. 총 두 행입니다.
같은 데이터라도 함수에 따라 행 수가 달라집니다. 질문의 요구에 맞게 선택하십시오.
부서를 포함하고 이름 조인하기
면접관은 부서 테이블을 추가하고 부서 이름을 묻는 경우가 많습니다. 순위를 매긴 뒤 부서 테이블을 조인하십시오.
employee 테이블에서 순위를 유지하고 마지막에 조회 테이블을 조인하십시오. 그래야 분할이 올바른 단위에서 이루어집니다.
SELECT d.name AS department, t.name AS employee, t.salary
FROM (
SELECT name, department_id, salary,
DENSE_RANK() OVER (
PARTITION BY department_id ORDER BY salary DESC
) AS rnk
FROM employee
) t
JOIN department d ON d.id = t.department_id
WHERE t.rnk = 1;피해야 할 실수
그룹별 순위에서 흔히 발생하는 실수는 다음과 같습니다.
PARTITION BY를 빠뜨리고 전체를 대상으로 순위를 매겨 회사 전체에서 가장 높은 급여를 받는 직원만 반환하는 경우- 질문에서 동률인 직원이 모두 나타나야 한다는 의미인데도
ROW_NUMBER를 사용하여 공동 최고 급여 수령자를 조용히 제외하는 경우 - 윈도 함수를 감싸지 않고
WHERE에 직접 넣으려는 경우 - 순위를 매기기 전에 부서 테이블을 조인하여 분할 단위를 실수로 바꾸는 경우
빠른 확인
요구 사항에 맞는 순위 함수를 선택하십시오.
복습
부서별 최고 급여 수령자는 전역 순위 패턴에 PARTITION BY department_id를 더한 것입니다.
- DENSE_RANK = 1은 부서별로 동률인 최고 급여 수령자를 모두 반환합니다.
- ROW_NUMBER = 1은 동률 해소 기준과 함께 사용하면 부서마다 정확히 한 명을 반환합니다.
- 이식성 높은 대안으로는 부서별 상관
MAX또는GROUP BY로 계산한 최고값을 원래 테이블에 다시 조인하는 방식이 있습니다.
= 1을 <= N으로 바꾸면 상위 N개로 확장할 수 있습니다. 동률을 어떻게 처리할지 소리 내어 설명하십시오.
자주 묻는 질문
“부서별 최고 연봉자” 강의는 무료인가요?
네 — “부서별 최고 연봉자” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Interview Prep 강의 전체를 잠금 해제할 수 있습니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“부서별 최고 연봉자”에서 뭘 배우나요?
그룹별 상위 N개 급여 문제를 위해 파티션과 순위 매기기를 결합합니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“부서별 최고 연봉자” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.