NTILE (Transact-SQL)

Distribui as linhas de uma partição ordenada em um número de grupos especificado. Os grupos são numerados, iniciando em um. Para cada linha, NTILE retorna o número do grupo ao qual a linha pertence.

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

Sintaxe

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

Argumentos

  • integer_expression
    É uma expressão constante inteira positiva que especifica o número de grupos nos quais cada partição deve ser dividida. integer_expression pode ser do tipo int ou bigint.

    ObservaçãoObservação

    integer_expression só podem fazer referência a colunas na cláusula PARTITION BY. integer_expression não podem fazer referência a colunas listadas na cláusula FROM atual.

  • <partition_by_clause>
    Divide o conjunto de resultados produzido pela cláusula FROM nas partições às quais a função RANK é aplicada. Para obter a sintaxe de PARTITION BY, consulte Cláusula OVER (Transact-SQL).

  • < order_by_clause >
    Determina a ordem na qual os valores de NTILE são atribuídos às linhas de uma partição. Para obter mais informações, consulte Cláusula ORDER BY [Transact-SQL]. Um inteiro não pode representar uma coluna quando a <order_by_clause> é usada em uma função de classificação.

Tipos de retorno

bigint

Comentários

Se o número de linhas em uma partição não for divisível por integer_expression, isso causará grupos de dois tamanhos que diferem por um membro. Grupos maiores aparecem antes de grupos menores na ordem especificada pela cláusula OVER. Por exemplo, se o número total de linhas for 53 e o número de grupos for cinco, os três primeiros grupos terão 11 linhas e os dois grupos restantes terão 10 linhas cada. Por outro lado, se o número total de linhas for divisível pelo número de grupos, as linhas serão igualmente distribuídas entre os grupos. Por exemplo, se o número total de linhas for 50 e houver cinco grupos, cada pacote conterá 10 linhas.

Exemplos

A. Dividindo linhas em grupos

O exemplo a seguir divide as linhas em quatro grupos. Como o número total de linhas não é divisível pelo número de grupos, o primeiro grupo terá quatro linhas e os grupos restantes terão três linhas cada.

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

B. Dividindo o conjunto de resultados usando PARTITION BY

O exemplo a seguir adiciona o argumento PARTITION BY ao código no exemplo A. Primeiro, as linhas são particionadas por PostalCode e depois divididas em quatro grupos em cada PostalCode. Observe que ORDER BY na cláusula OVER ordena NTILE, e que ORDER BY da instrução SELECT ordena o conjunto de resultados.

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