윈도우 함수는 개별 행으로 그룹화하지 않고도 "창"의 행에 대해 계산을 수행할 수 있어 보고서 및 분석에 유용합니다.
예시:
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;
테이블:
| name | salary |
|---|---|
| 바샤 | 10000 |
| 페챠 | 10000 |
| 마샤 | 9000 |
결과:
| name | salary | num | rank | dense_rank |
|---|---|---|---|---|
| 바샤 | 10000 | 1 | 1 | 1 |
| 페챠 | 10000 | 2 | 1 | 1 |
| 마샤 | 9000 | 3 | 3 | 2 |
잠재적인 문제점:
윈도우 함수에서 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()를 사용할 때 순위에서 пропуски를 허용하지 않음을 간과하여 판매 분석 시 "독특한" 중요한 위치 수에 대한 보고서를 왜곡했습니다. 비즈니스 로직 검토에서 순위 분포의 오류가 발견되었습니다.