부서별 상위 세 명을 구하는데 동점자를 포함할지에 따라 결과 수가 달라집니다. ROW_NUMBER·RANK·DENSE_RANK는 어떻게 고르나요?
잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?
답변과 점검 포인트 펼치기답변 접기
구두 답변
정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.
세 함수는 순위의 동점 처리와 다음 번호에서 차이가 납니다. ROW_NUMBER는 행마다 번호를 주고 RANK는 동점에 같은 순위와 다음 순위의 간격을 두며 DENSE_RANK는 간격 없이 다음 순위를 줍니다.
동작 원리와 전제
점수 100,100,90이면 순서는 각각 1·2·3, 1·1·3, 1·1·2가 될 수 있습니다. ROW_NUMBER에서 동점 순서를 재현하려면 유일한 보조 정렬 키를 넣습니다. PARTITION BY로 부서를 나누는 것과 GROUP BY로 행을 집계해 줄이는 것은 다릅니다.
선택과 실패 처리
정확히 세 행인지 상위 세 순위의 모든 동점자인지 요구를 정합니다. 윈도 결과를 필터링하려면 엔진의 QUALIFY 지원이나 서브쿼리를 사용합니다. 정렬과 partition 비용은 인덱스·메모리·데이터 편중에 영향을 받고 큰 부서는 spill을 만들 수 있습니다.
구체적인 사례와 검증
동점자 전원을 상위 세 순위로 포함하려면 결과가 세 행보다 많을 수 있습니다. 정확히 세 명에게 보상해야 한다면 점수 뒤에 달성 시각·사용자 ID 같은 전체 순서를 정하고 ROW_NUMBER를 사용할 수 있습니다. 어느 쪽이 공정한지는 SQL 함수가 아니라 제품 규칙입니다. window의 ORDER BY는 순위 계산 순서이며 최종 SELECT 결과의 출력 순서를 자동 보장한다고 가정하지 않고 필요한 ORDER BY를 둡니다. 큰 부서 하나에 데이터가 몰리면 전체 행 수 평균보다 정렬 메모리가 중요할 수 있어 분포별 계획을 봅니다. 보상 결과는 변하는 현재 조회가 아니라 고정된 집계 버전에서 재현해야 합니다.
동점·한 명인 부서·NULL 점수·동시 갱신을 포함해 결과를 확인합니다. 페이지네이션과 보상 확정에는 정렬 규칙과 기준 스냅샷이 필요합니다. 순위 함수가 현재 조회 결과를 정할 뿐 변하는 데이터의 영구적인 순위를 보장하지는 않습니다.
득점 포인트
이해가 드러나는 지점을 확인해 보세요.
- 핵심 구분: 세 함수는 순위의 동점 처리와 다음 번호에서 차이가 납니다.
- 선택 조건: 정확히 세 행인지 상위 세 순위의 모든 동점자인지 요구를 정합니다.
- 검증 기준: 동점·한 명인 부서·NULL 점수·동시 갱신을 포함해 결과를 확인합니다.
감점 포인트
놓치기 쉬운 조건과 오해를 짚어 보세요.
- 상위 세 순위가 항상 정확히 세 행을 반환한다고 말한다.
더 파고들 거리
하나 더 질문하며 이해의 범위를 넓혀 보세요.
- 동점자의 입력 순서를 보존하는 것과 입력에 무관한 결정적 순서를 만드는 것은 어떻게 다른가요?
- 상위 K 밖의 점수가 바뀌거나 K위 점수가 내려가면 어떤 추가 정보가 필요한가요?
- 뒤 페이지를 일정한 탐색 범위로 읽으려면 어떤 유일한 정렬 키를 커서에 넣나요?
득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.
원리부터 공부하고 싶다면
답변을 보충하는 개념·예제·슈도코드를 읽어 보세요.