NTILE(Transact-SQL)

정렬된 파티션의 행을 지정된 수의 그룹으로 분산시킵니다. 그룹에는 1부터 시작하는 번호가 매겨집니다. NTILE은 각 행에서 해당 행이 속한 그룹 번호를 반환합니다.

항목 링크 아이콘Transact-SQL 구문 표기 규칙

구문

NTILE (integer_expression)    OVER ( [ <partition_by_clause> ] < order_by_clause > )

인수

  • integer_expression
    각 파티션을 분할해야 하는 그룹 수를 지정하는 양의 정수 상수 식입니다. integer_expression은 int 또는 bigint 유형이 될 수 있습니다.

    [!참고]

    integer_expression은 PARTITION BY 절의 열만 참조할 수 있습니다. integer_expression에서 현재 FROM 절에 나열된 열을 참조할 수는 없습니다.

  • <partition_by_clause>
    FROM 절이 생성하는 결과 집합을 RANK 함수가 적용되는 파티션으로 분할합니다. PARTITION BY 구문은 OVER 절(Transact-SQL)을 참조하십시오.

  • < order_by_clause >
    파티션의 각 행에 NTILE 값이 할당되는 순서를 결정합니다. 자세한 내용은 ORDER BY 절(Transact-SQL)을 참조하십시오. <order_by_clause>가 _순위 함수에 사용된 경우 정수는 열을 나타낼 수 없습니다.

반환 유형

bigint

주의

파티션의 행 수를 integer_expression으로 나눌 수 없는 경우 멤버 수 하나의 차이가 있는 두 가지 크기의 그룹이 생성됩니다. OVER 절이 지정한 순서에서 큰 그룹이 작은 그룹 앞에 옵니다. 예를 들어 행의 총 수가 53개이고 그룹 수가 5개이면 처음 3개 그룹은 11개의 행을 포함하고 나머지 두 개 그룹은 10개의 행을 포함합니다. 반면에 행의 총 수를 그룹 수로 나눌 수 있으면 각 그룹에 행이 똑같이 분산됩니다. 예를 들어 행의 총 수가 50개이고 그룹이 5개 있으면 각 그룹이 10개의 행을 포함합니다.

1. 행을 그룹으로 나누기

다음 예에서는 4개의 그룹으로 행을 나눕니다. 행의 총 수를 그룹 수로 나눌 수 없으므로 첫 번째 그룹은 4개의 행을 포함하고 나머지 그룹은 각각 3개의 행을 포함합니다.

USE AdventureWorks;
GO
SELECT c.FirstName, c.LastName
    ,NTILE(4) OVER(ORDER BY SalesYTD DESC) AS 'Quartile'
    ,s.SalesYTD, a.PostalCode
FROM Sales.SalesPerson s 
    INNER JOIN Person.Contact c 
        ON s.SalesPersonID = c.ContactID
    INNER JOIN Person.Address a 
        ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL 
    AND SalesYTD <> 0;
GO

2. PARTITION BY를 사용하여 결과 집합 나누기

다음 예에서는 예 A의 코드에 PARTITION BY 인수를 추가합니다. 행은 먼저 PostalCode로 분할된 다음 각 PostalCode 내에 4개 그룹으로 나누어집니다. OVER 절의 ORDER BY는 NTILE을 정렬하고 SELECT 문의 ORDER BY는 결과 집합을 정렬합니다.

USE AdventureWorks;
GO
SELECT c.FirstName, c.LastName
    ,NTILE(4) OVER(PARTITION BY PostalCode ORDER BY SalesYTD DESC) AS 'Quartile'
    ,s.SalesYTD, a.PostalCode
FROM Sales.SalesPerson s 
    INNER JOIN Person.Contact c 
        ON s.SalesPersonID = c.ContactID
    INNER JOIN Person.Address a 
        ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL 
    AND SalesYTD <> 0
ORDER BY LastName;
GO