ntile

ntile

파티션 안의 정렬된 행들을 가능한 한 크기가 같은 지정된 개수의 버킷(그룹)으로 나누고, 현재 행이 속한 버킷 번호를 반환하는 윈도우 함수예요. 버킷은 1부터 번호가 매겨집니다. 각 파티션에서 행은 순서대로 버킷에 배정되는데, 행 수가 버킷 수로 나누어떨어지지 않으면 앞쪽 버킷들이 뒤쪽 버킷보다 한 행씩 더 받아요.

출처: 문서

본문

구문(Syntax)

ntile (buckets)
  OVER ([[PARTITION BY grouping_column] [ORDER BY sorting_column]
        ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING] | [window_name])
FROM table_name
WINDOW window_name as ([PARTITION BY grouping_column] [ORDER BY sorting_column] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)

buckets 인자는 상수 양의 정수여야 해요. ORDER BY 절은 필수예요. 윈도우 프레임은 전체 파티션이어야 하며(ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), 이는 명시적으로 지정하지 않을 때 사용되는 기본 프레임이기도 해요. 윈도우 함수 구문에 대한 자세한 내용은 윈도우 함수 - 구문을 참고하세요.

반환 값(Returned value)

  • 파티션 안에서 현재 행의 버킷 번호. UInt64.

예시(Example)

다음 예시는 선수들을 연봉 내림차순으로 정렬해 네 개의 버킷으로 나눕니다.

쿼리(Query)

CREATE TABLE salaries
(
    `team` String,
    `player` String,
    `salary` UInt32,
    `position` String
)
Engine = Memory;

INSERT INTO salaries FORMAT Values
    ('Port Elizabeth Barbarians', 'Gary Chen', 195000, 'F'),
    ('New Coreystad Archdukes', 'Charles Juarez', 190000, 'F'),
    ('Port Elizabeth Barbarians', 'Michael Stanley', 150000, 'D'),
    ('New Coreystad Archdukes', 'Scott Harrison', 150000, 'D'),
    ('Port Elizabeth Barbarians', 'Robert George', 195000, 'M'),
    ('South Hampton Seagulls', 'Douglas Benson', 150000, 'M'),
    ('South Hampton Seagulls', 'James Henderson', 140000, 'M');

쿼리(Query)

SELECT player, salary,
       ntile(4) OVER (ORDER BY salary DESC, player ASC) AS bucket
FROM salaries;

응답(Response)

   ┌─player──────────┬─salary─┬─bucket─┐
1. │ Gary Chen       │ 195000 │      1 │
2. │ Robert George   │ 195000 │      1 │
3. │ Charles Juarez  │ 190000 │      2 │
4. │ Douglas Benson  │ 150000 │      2 │
5. │ Michael Stanley │ 150000 │      3 │
6. │ Scott Harrison  │ 150000 │      3 │
7. │ James Henderson │ 140000 │      4 │
   └─────────────────┴────────┴────────┘

여기에는 행이 7개, 버킷이 4개이므로 처음 세 버킷은 각각 두 행씩, 마지막 버킷은 한 행을 포함합니다.

더 알아보기 (Learn more)