상위 N개 결과에서 동점 처리하기
동점인 행을 모두 포함해야 할 때 RANK나 DENSE_RANK를 사용하는 방법을 알아봅니다.
상위 N개 결과에서 동점 처리하기은(는) CoddyKit의 무료 Coding Interview Prep 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Coding Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
동률에 관한 후속 질문
ROW_NUMBER로 상위 N개 문제를 완벽하게 해결하고 나면, 면접관은 더 까다로운 질문을 던집니다. "기준선에서 두 직원의 급여가 정확히 같다면 어떻게 해야 합니까? 두 사람 모두 포함해야 합니까?"
이 질문은 쿼리 하나를 외운 지원자와 순위 의미를 이해하는 지원자를 구분합니다. 답은 ROW_NUMBER, RANK, DENSE_RANK 중 무엇을 선택하느냐에 달려 있습니다. 이 레슨에서는 각 함수를 비즈니스 요구 사항에 맞춰 설명합니다.
ROW_NUMBER가 동률을 숨기는 이유
ROW_NUMBER는 각 행에 엄격하게 고유한 정수를 할당합니다. 정렬 열의 값이 같은 두 행이 있어도, 임의의 순서에 따라 한 행에는 2, 다른 행에는 3이 부여됩니다.
그 결과 WHERE rn <= 3 필터는 정확히 3개의 행을 반환하며, 포함할 만한 동률 행 하나를 아무런 표시 없이 제외할 수 있습니다. 실제로 고정된 개수를 원한다면 괜찮지만, 동률인 모든 행을 포함해야 한다면 잘못된 방식입니다.
-- Salaries: 100, 90, 90, 80
-- ROW_NUMBER -> 1, 2, 3, 4 (the two 90s get 2 and 3 arbitrarily)
ROW_NUMBER() OVER (ORDER BY salary DESC)RANK는 간격을 남김
RANK는 동률인 행에 같은 순위를 부여한 다음, 동률을 반영하기 위해 다음 순위 값을 건너뜁니다. 순위 2에서 두 행이 동률이면 두 행 모두 2이고, 다음 행은 3이 아니라 4가 됩니다.
여러 사람이 하나의 순위를 차지할 수 있는 "상위 3개 순위"를 원할 때 RANK를 사용하십시오. 두 명의 은메달리스트가 있으면 동메달리스트가 없는 실제 대회 순위와 같은 방식입니다.
-- Salaries: 100, 90, 90, 80
-- RANK -> 1, 2, 2, 4 (rank 3 is skipped)
RANK() OVER (ORDER BY salary DESC)DENSE_RANK는 간격이 없음
DENSE_RANK도 동률인 행에 같은 순위를 부여하지만 그다음 순위를 건너뛰지 않습니다. 순위 2에서 두 행이 동률이면 두 행 모두 2이고, 다음으로 서로 다른 값은 3입니다.
질문이 고유 값에 관한 것일 때 DENSE_RANK를 사용하십시오. 예를 들어 "가장 높은 고유 급여 수준 3개" 또는 "상위 3개 가격 등급"을 구하는 경우입니다. 행이 아니라 고유한 값을 셉니다.
-- Salaries: 100, 90, 90, 80
-- DENSE_RANK -> 1, 2, 2, 3 (no gap)
DENSE_RANK() OVER (ORDER BY salary DESC)나란히 비교
급여 목록이 100, 90, 90, 80일 때 세 함수의 결과는 다음과 같습니다.
- ROW_NUMBER: 1, 2, 3, 4
- RANK: 1, 2, 2, 4
- DENSE_RANK: 1, 2, 2, 3
이 표는 완전히 외워 둘 가치가 있습니다. 면접관은 주어진 목록에 대해 표를 직접 완성하라고 요구할 수도 있으며, 순위 간격이 어떻게 처리되는지 정확히 아는 것이 핵심입니다.
SELECT salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn,
RANK() OVER (ORDER BY salary DESC) AS rnk,
DENSE_RANK() OVER (ORDER BY salary DESC) AS drnk
FROM employees;RANK로 동률인 모든 행 포함
"상위 3개를 구하되 기준선에서 동률인 모든 사람을 포함하세요"라는 질문에 답하려면 RANK() <= 3으로 필터링하십시오. 두 사람이 순위 3에서 동률이면 두 사람 모두 표시되므로 결과에 3개보다 많은 행이 포함될 수 있습니다.
이는 "임의의 행 3개"가 아니라 "상위 3개 순위"라고 표현된 질문의 의도입니다. 동률이 발생하면 행 수가 N을 초과할 수 있다는 점을 명확히 말하십시오.
WITH ranked AS (
SELECT name, department, salary,
RANK() OVER (
PARTITION BY department ORDER BY salary DESC
) AS rnk
FROM employees
)
SELECT name, department, salary, rnk
FROM ranked
WHERE rnk <= 3
ORDER BY department, rnk;DENSE_RANK로 상위 3개 고유 수준 구하기
요구 사항이 "상위 3개의 고유 급여 수준"이고 이 세 수준에 속하는 모든 직원을 포함해야 한다면 DENSE_RANK() <= 3을 사용하십시오.
해당 급여 등급에 직원이 얼마나 많이 몰려 있든 상위 세 등급의 모든 직원이 포함되므로 많은 행이 반환될 수 있습니다. 핵심은 DENSE_RANK가 고유한 값을 센다는 점입니다. 따라서 이 필터는 고정된 행 수가 아니라 값 등급을 선택합니다.
WITH ranked AS (
SELECT name, salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS drnk
FROM employees
)
SELECT name, salary, drnk
FROM ranked
WHERE drnk <= 3
ORDER BY drnk;선택 가이드
질문의 표현을 함수에 맞춰 보십시오.
- "정확히 N개의 행" 또는 페이지 매김 →
ROW_NUMBER(동률 해소 기준을 추가합니다). - "상위 N개 순위, 동률은 같은 순위 공유" →
RANK. - "상위 N개의 고유 값/수준/등급" →
DENSE_RANK.
사양이 모호하다면 "기준선에서 동률이 발생할 때 동률인 모든 행을 포함해야 합니까, 아니면 N개로 제한해야 합니까?"라고 물어보십시오. 이런 명확화 질문 자체로도 점수를 얻을 수 있습니다.
동률 해소 기준은 여전히 중요함
RANK 또는 DENSE_RANK를 사용하더라도 보조 ORDER BY 키를 추가하면 동률인 행의 표시 순서를 제어하고 결과를 안정적으로 유지할 수 있습니다. 어떤 행이 조건을 만족하는지는 바꾸지 않지만, 결과를 재현 가능하게 만듭니다.
ROW_NUMBER에서는 동률 해소 기준이 필수입니다. rn 기준선을 넘었을 때 어떤 동률 행이 살아남을지를 결정하기 때문입니다.
RANK() OVER (
PARTITION BY department
ORDER BY salary DESC, name ASC
) AS rnk예시: 상위 득점자
game_scores 테이블에 player와 score가 있습니다. 면접관은 "상위 2개 점수 순위에 해당하는 모든 선수"를 원합니다. 1위에서 동률이면 1위 선수가 두 명이 되고, 그다음으로 서로 다른 점수가 2위가 됩니다.
동률 뒤에 순위를 건너뛰지 않는 "순위"라는 표현은 DENSE_RANK를 가리킵니다. 반대로 "순위를 건너뛰는 상위 2개 순위"라고 했다면 RANK로 바꿔야 합니다. 질문의 정확한 표현을 주의 깊게 들으십시오.
WITH r AS (
SELECT player, score,
DENSE_RANK() OVER (ORDER BY score DESC) AS pos
FROM game_scores
)
SELECT player, score, pos
FROM r
WHERE pos <= 2
ORDER BY pos, player;피해야 할 흔한 실수
면접관이 주의 깊게 살피는 실수:
- 동률을 포함해야 하는 질문에
ROW_NUMBER를 사용하여 조건을 충족하는 행을 아무런 표시 없이 제외하는 것. RANK와DENSE_RANK의 순위 간격 처리 방식을 혼동하는 것.RANK/DENSE_RANK필터가 N개보다 많은 행을 반환할 수 있다는 점을 잊고, 결과가 잘못되었다고 말하는 것.- 그룹별 상위 N개를 구하면서
PARTITION BY를 빠뜨려 전체 테이블의 순위를 매기는 것.
빠른 확인
설명된 동률 처리 방식에 맞는 순위 함수를 선택하십시오.
복습: 동률 처리
세 함수, 세 가지 동률 처리 방식:
- ROW_NUMBER: 항상 고유하며 정확히 N개 행을 반환하고, 동률은 임의의 순서로 결정됩니다.
- RANK: 동률은 같은 순위를 공유하고, 그다음 순위에는 건너뛴 번호가 생깁니다.
- DENSE_RANK: 동률은 같은 순위를 공유하고, 건너뛴 번호가 없으며 서로 다른 값의 순위를 셉니다.
질문의 표현에 따라 선택하고, 모호하면 명확히 질문하십시오. 또한 RANK/DENSE_RANK 필터는 설계상 N개보다 많은 행을 반환할 수 있다는 점을 기억하십시오.
자주 묻는 질문
“상위 N개 결과에서 동점 처리하기” 강의는 무료인가요?
네 — “상위 N개 결과에서 동점 처리하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Coding Interview Prep 강의 전체를 잠금 해제할 수 있습니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“상위 N개 결과에서 동점 처리하기”에서 뭘 배우나요?
동점인 행을 모두 포함해야 할 때 RANK나 DENSE_RANK를 사용하는 방법을 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 Coding Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Coding Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Coding Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“상위 N개 결과에서 동점 처리하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Coding Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Coding Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- ROW_NUMBER로 그룹별 상위 N개 행 찾기
- 상위 N개 결과에서 동점 처리하기
- 안전하게 행 중복 제거하기
- 키별 최신 행 유지하기