NTILE (Transact-SQL)
Mis à jour : 17 juillet 2006
Distribue les lignes d'une partition triée dans un nombre spécifié de groupes. Les groupes sont numérotés à partir de un. Pour chaque ligne, NTILE retourne le numéro du groupe auquel la ligne appartient.
Conventions de la syntaxe de Transact-SQL
Syntaxe
NTILE (integer_expression) OVER ( [ <partition_by_clause> ] < order_by_clause > )
Arguments
integer_expression
Expression constante dont la valeur est un entier positif qui spécifie le nombre de groupes utilisés pour diviser chaque partition. integer_expression peut être de type int ou bigint.Remarque : L'argument integer_expression peut uniquement faire référence à des colonnes dans la clause PARTITION BY. integer_expression ne peut pas faire référence à des colonnes répertoriées dans la clause FROM actuelle.
- <partition_by_clause>
Divise l'ensemble de résultats généré par la clause FROM en partitions auxquelles la fonction RANK est appliquée. Pour connaître la syntaxe de PARTITION BY, consultez Clause OVER (Transact-SQL).
- < order_by_clause >
Détermine l'ordre dans lequel les valeurs de NTILE sont assignées aux lignes d'une partition. Pour plus d'informations, consultez Clause ORDER BY (Transact-SQL). Un entier ne peut pas représenter une colonne lorsque <order_by_clause> est utilisé dans une fonction de classement.
Notes
Si le nombre de lignes d'une partition n'est pas divisible par integer_expression, vous obtiendrez des groupes de deux tailles différentes qui diffèrent d'un membre. Les groupes plus grands viennent avant les groupes plus petits dans l'ordre spécifié par la clause OVER. Par exemple, si le nombre total de lignes est égal à 53 et qu'il y a 5 groupes, les trois premiers groupes contiendront 11 lignes et les deux derniers, 10 lignes. En revanche, si le nombre total de lignes est divisible par le nombre de groupes, les lignes seront réparties équitablement entre les différents groupes. Par exemple, si le nombre total de lignes est égal à 50 et qu'il y a 5 groupes, chacun d'eux contiendra 10 lignes.
Types de retour
bigint
Exemple
A. Division des lignes en groupes
L'exemple suivant divise les lignes en 4 groupes. Dans la mesure où le nombre total de lignes n'est pas divisible par le nombre de groupes, le premier groupe contient 4 lignes tandis que les autres en possèdent 3 chacun.
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. Division de l'ensemble de résultats à l'aide de PARTITION BY
L'exemple suivant ajoute l'argument PARTITION BY
au code de l'exemple A. Les lignes sont d'abord partitionnées par PostalCode
, puis divisées en 4 groupes à l'intérieur de chaque PostalCode
. Notez que l'argument ORDER BY
de la clause OVER
détermine l'ordre des valeurs NTILE
tandis que l'argument ORDER BY
de l'instruction SELECT
détermine l'ordre de l'ensemble de résultats.
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
Voir aussi
Référence
RANK (Transact-SQL)
DENSE_RANK (Transact-SQL)
ROW_NUMBER (Transact-SQL)
Fonctions de classement (Transact-SQL)
Fonctions (Transact-SQL)