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.
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çã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