그룹별 Top-N
Coddy SQL 여정의 심화 과정 섹션에 포함된 레슨 — 27개 중 23번째.
"부서별 최고 급여 수령자"는 전형적인 예시입니다. 해결 방법은 항상 PARTITION BY와 ROW_NUMBER()를 사용한 다음, 1행으로 필터링하는 것입니다.
WITH ranked AS (
SELECT name, department, salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
FROM employees
)
SELECT name, department, salary FROM ranked WHERE rn = 1상위 1위 대신 상위 3위를 원하시나요? WHERE rn = 1을 WHERE rn <= 3으로 변경하세요. 상위권에서 공동 순위를 허용하고 싶으신가요? ROW_NUMBER()를 RANK()로 바꾸세요.
챌린지
쉬움사용 가능한 테이블 및 컬럼:
<strong>employees</strong>:<strong>id</strong>,<strong>name</strong>,<strong>department</strong>,<strong>salary</strong>
각 department에서 가장 높은 급여를 받는 직원을 반환하세요. name, department, salary를 출력하고, department를 기준으로 정렬하세요. 만약 한 부서 내에서 최고 급여자가 두 명 이상인 경우, id가 낮은 한 명만 반환하세요.
치트 시트
그룹별로 상위 N개의 행을 가져오려면 ROW_NUMBER()와 PARTITION BY를 사용한 다음 필터링하세요:
WITH ranked AS (
SELECT name, department, salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
FROM employees
)
SELECT name, department, salary FROM ranked WHERE rn = 1- 상위 3개를 가져오려면
WHERE rn = 1을WHERE rn <= 3으로 변경하세요 - 공동 순위를 허용하려면
ROW_NUMBER()를RANK()로 바꾸세요
직접 해보기
WITH ranked AS (
-- ROW_NUMBER() OVER (PARTITION BY department ORDER BY ...)
)
SELECT name, department, salary FROM ranked WHERE rn = 1
ORDER BY department
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.