균등 버킷

NTILE은 정렬된 행 수를 균등한 버킷으로 나눈다

NTILE(N)은 값의 범위를 같은 폭으로 자르지 않습니다. 먼저 행을 정렬하고, 전체 행을 N개 버킷에 최대한 균등하게 배분합니다. 남는 행은 앞쪽 버킷부터 하나씩 받습니다.

정렬된 10개 행
1 2 3 4 5 6 7 8 9 10
1번 버킷 1-4위, 4행
1 2 3 4
2번 버킷 5-7위, 3행
5 6 7
3번 버킷 8-10위, 3행
8 9 10
10행을 3으로 나누면 각 버킷의 기본 몫은 3행이다.
나머지 남는 1행은 앞쪽 버킷부터 배정되어 1번만 4행이 된다.
경계 행 번호 기준으로 자르므로 점수 간격이 같을 필요는 없다.
정렬된 입력

ORDER BY가 버킷의 의미를 먼저 정한다

198
295
391
488
584
681
777
871
966
1062
1번 버킷 남는 1행을 먼저 받음
4행
2번 버킷 기본 몫 3행
3행
3번 버킷 기본 몫 3행
3행
쿼리 형태

정렬 방향과 보조 키가 버킷 경계를 고정한다

SELECT student, score,
       NTILE(3) OVER (
         ORDER BY score DESC, student_id
       ) AS score_band
FROM exam_scores;
DESC 높은 점수가 1번 버킷에 들어간다.
ASC 낮은 점수가 1번 버킷에 들어간다.
동점 보조 정렬 키가 없으면 같은 점수도 다른 버킷에 갈 수 있다.
행 수 기준

값 범위가 아니라 행 개수를 나눈다

점수 차이가 커도 행 순서상 같은 개수로 잘립니다. 값의 폭을 나누려면 별도의 범위 조건이 필요합니다.

남는 행

나머지는 앞 버킷부터 배정

10행을 3개로 나누면 1행이 남으므로 결과는 4, 3, 3이 됩니다. 11행이면 4, 4, 3입니다.

정렬 필수

ORDER BY 없는 버킷은 의미가 약하다

분석 구간은 순서가 의미를 만듭니다. 재현 가능한 결과를 위해 동점을 깨는 보조 키까지 둡니다.