프로그래밍BI/SQL 분석가

ROW_NUMBER(), RANK(), DENSE_RANK()는 SQL 보고서를 프로그래밍할 때 어떻게 작동하며 어떻게 다릅니까? 사용 시 어떤 잠재적인 문제점이 있습니까?

Hintsage AI 어시스턴트로 면접 통과

답변

윈도우 함수는 개별 행으로 그룹화하지 않고도 "창"의 행에 대해 계산을 수행할 수 있어 보고서 및 분석에 유용합니다.

  • ROW_NUMBER() — 각 파티션(분할) 내에서 행에 고유한 순차 번호를 할당하며, 지정된 기준에 따라 정렬합니다. ORDER BY에서 동일한 값이 있을 경우 번호가 пропуски할 수 있습니다.
  • RANK() — 동일한 ORDER BY 값을 가진 행에 동일한 순위를 할당하지만, 다음 요소의 번호는 пропуска합니다(간격이 생깁니다).
  • DENSE_RANK() — 동일한 값을 가진 행에 동일한 순위를 부여하지만 번호는 연속적으로, пропуски 없이 부여됩니다.

예시:

SELECT name, salary, ROW_NUMBER() OVER (ORDER BY salary DESC) AS num, RANK() OVER (ORDER BY salary DESC) AS rank, DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank FROM employees;

테이블:

namesalary
바샤10000
페챠10000
마샤9000

결과:

namesalarynumrankdense_rank
바샤10000111
페챠10000211
마샤9000332

잠재적인 문제점:

  • 잘못 선택된 ORDER BY는 잘못된 정렬을 초래할 수 있습니다.
  • (row_number) ORDER BY에서 고유한 필드를 선택하지 않으면 안정적인 순서에 대한 보장이 없습니다.
  • PARTITION BY 없이 사용하면 전체 행 집합에 대해 잘못된 번호가 매겨질 수 있습니다.

트릭 질문

윈도우 함수에서 PARTITION BY를 지정하지 않으면 ROW_NUMBER()에서 행 번호는 어떻게 부여됩니까?

답변: 모든 데이터 선택이 하나의 파티션으로 간주됩니다. 즉, 모든 행에 대해 일관된 수 번호가 부여되며, 어떤 그룹화도 고려되지 않습니다.

예시:

SELECT *, ROW_NUMBER() OVER (ORDER BY salary DESC) FROM employees; -- 모든 직원이 부서 구분 없이 1부터 시작하여 고유 번호를 받게 됩니다.

이야기 №1

BI 보고서에서 부서별 PARTITION BY를 지정하는 것을 잊었습니다. 결과적으로 회사의 모든 직원은 연속적으로 스크립트를 매겨지게 되었고, 목표는 각 부서의 최고의 직원을 식별하는 것이었습니다. 그 결과 부서별로 잘못된 TOP-N 직원이 생성되었습니다.


이야기 №2

개발자가 "그룹" 내에서 "최고의" 직원을 결정하기 위해 RANK()를 선택했지만, 동일한 성과의 경우 동일한 번호가 할당되었고, 이로 인해 분석에서 리더의 무의식적 중복이 발생했습니다.


이야기 №3

DENSE_RANK()를 사용할 때 순위에서 пропуски를 허용하지 않음을 간과하여 판매 분석 시 "독특한" 중요한 위치 수에 대한 보고서를 왜곡했습니다. 비즈니스 로직 검토에서 순위 분포의 오류가 발견되었습니다.