Partager via


NTILE (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Base de données SQL dans Microsoft Fabric

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 nombre du groupe auquel appartient la ligne.

Conventions de la syntaxe Transact-SQL

Syntaxe

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

Arguments

integer_expression

Expression entière positive qui spécifie le nombre de groupes dans lesquels chaque partition doit être divisée. integer_expression peut être de type int ou bigint.

<clause_partition_by>

Divise le jeu de résultats produit par la clause FROM plus JOIN, APPLY, PIVOT en partitions auxquelles la fonction est appliquée. Pour la PARTITION BY syntaxe, consultez la clause SELECT - OVER.

<order_by_clause>

Détermine l’ordre dans lequel les NTILE valeurs sont affectées aux lignes d’une partition. Un entier ne peut pas représenter une colonne lorsque la <order_by_clause> est utilisée dans une fonction de classement.

Types de retour

bigint

Notes

Si le nombre de lignes d’une partition n’est pas divisible par integer_expression, cela entraîne des groupes de deux tailles qui diffèrent d’un membre. Les groupes plus volumineux sont fournis avant les groupes plus petits dans l’ordre spécifié par la OVER clause. Par exemple, si le nombre total de lignes est de 53 et que le nombre de groupes est de cinq, les trois premiers ont 11 lignes et les deux groupes restants ont chacun 10 lignes. En revanche, le nombre total de lignes est divisible par le nombre de groupes, les lignes sont réparties uniformément entre les groupes. Par exemple, si le nombre total de lignes est de 50 et qu’il existe cinq groupes, chaque compartiment contient 10 lignes.

NTILE n’est pas déterministe. Pour plus d’informations, consultez fonctions déterministes et non déterministes.

Exemples

Les exemples de code de cet article utilisent la base de données ou AdventureWorks2025 l’exemple AdventureWorksDW2025 de base de données, que vous pouvez télécharger à partir de la page d’accueil microsoft SQL Server Samples and Community Projects.

Note

Dans les exemples suivants, la fonction CONVERT est utilisée pour mettre en forme les SalesYTD données en tant que devise.

R. Diviser des lignes en groupes

L'exemple suivant divise les lignes en quatre groupes d'employés en fonction de leurs ventes de l'année. Étant donné que le nombre total de lignes n’est pas divisible par le nombre de groupes, les deux premiers groupes ont quatre lignes et les groupes restants ont trois lignes chacune.

USE AdventureWorks2022;
GO

SELECT p.FirstName,
       p.LastName,
       NTILE(4) OVER (ORDER BY SalesYTD DESC) AS Quartile,
       CONVERT (NVARCHAR (20), s.SalesYTD, 1) AS SalesYTD,
       a.PostalCode
FROM Sales.SalesPerson AS s
     INNER JOIN Person.Person AS p
         ON s.BusinessEntityID = p.BusinessEntityID
     INNER JOIN Person.Address AS a
         ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL
      AND SalesYTD <> 0;
GO

Voici le jeu de résultats.

FirstName      LastName              Quartile  SalesYTD       PostalCode
-------------  --------------------- --------- -------------- ----------
Linda          Mitchell              1         4,251,368.55   98027
Jae            Pak                   1         4,116,871.23   98055
Michael        Blythe                1         3,763,178.18   98027
Jillian        Carson                1         3,189,418.37   98027
Ranjit         Varkey Chudukatil     2         3,121,616.32   98055
José           Saraiva               2         2,604,540.72   98055
Shu            Ito                   2         2,458,535.62   98055
Tsvi           Reiter                2         2,315,185.61   98027
Rachel         Valdez                3         1,827,066.71   98055
Tete           Mensa-Annan           3         1,576,562.20   98055
David          Campbell              3         1,573,012.94   98055
Garrett        Vargas                4         1,453,719.47   98027
Lynn           Tsoflias              4         1,421,810.92   98055
Pamela         Ansman-Wolfe          4         1,352,577.13   98027

B. Diviser le jeu 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. L’exemple déclare également une variable @NTILE_Var et utilise cette variable pour spécifier la valeur du paramètre integer_expression.

USE AdventureWorks2022;
GO

DECLARE @NTILE_Var AS INT = 4;

SELECT p.FirstName,
       p.LastName,
       NTILE(@NTILE_Var) OVER (PARTITION BY PostalCode ORDER BY SalesYTD DESC) AS Quartile,
       CONVERT (NVARCHAR (20), s.SalesYTD, 1) AS SalesYTD,
       a.PostalCode
FROM Sales.SalesPerson AS s
     INNER JOIN Person.Person AS p
         ON s.BusinessEntityID = p.BusinessEntityID
     INNER JOIN Person.Address AS a
         ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL
      AND SalesYTD <> 0;
GO

Voici le jeu de résultats.

FirstName    LastName             Quartile SalesYTD      PostalCode
------------ -------------------- -------- ------------  ----------
Linda        Mitchell             1        4,251,368.55  98027
Michael      Blythe               1        3,763,178.18  98027
Jillian      Carson               2        3,189,418.37  98027
Tsvi         Reiter               2        2,315,185.61  98027
Garrett      Vargas               3        1,453,719.47  98027
Pamela       Ansman-Wolfe         4        1,352,577.13  98027
Jae          Pak                  1        4,116,871.23  98055
Ranjit       Varkey Chudukatil    1        3,121,616.32  98055
José         Saraiva              2        2,604,540.72  98055
Shu          Ito                  2        2,458,535.62  98055
Rachel       Valdez               3        1,827,066.71  98055
Tete         Mensa-Annan          3        1,576,562.20  98055
David        Campbell             4        1,573,012.94  98055
Lynn         Tsoflias             4        1,421,810.92  98055

Exemples : Azure Synapse Analytics et Analytics Platform System (PDW)

C. Diviser des lignes en groupes

L’exemple suivant utilise la NTILE fonction pour diviser un ensemble de vendeurs en quatre groupes en fonction de leur quota de ventes attribué pour l’année 2003. Étant donné que le nombre total de lignes n’est pas divisible par le nombre de groupes, le premier groupe comporte cinq lignes et les groupes restants ont quatre lignes chacune.

-- Uses AdventureWorks
SELECT e.LastName,
       NTILE(4) OVER (ORDER BY SUM(SalesAmountQuota) DESC) AS Quartile,
       CONVERT (VARCHAR (13), SUM(SalesAmountQuota), 1) AS SalesQuota
FROM dbo.DimEmployee AS e
     INNER JOIN dbo.FactSalesQuota AS sq
         ON e.EmployeeKey = sq.EmployeeKey
WHERE sq.CalendarYear = 2003
      AND SalesTerritoryKey IS NOT NULL
      AND SalesAmountQuota <> 0
GROUP BY e.LastName
ORDER BY Quartile, e.LastName;

Voici le jeu de résultats.

LastName          Quartile SalesYTD
----------------- -------- ------------
Blythe            1        4,716,000.00
Carson            1        4,350,000.00
Mitchell          1        4,682,000.00
Pak               1        5,142,000.00
Varkey Chudukatil 1        2,940,000.00
Ito               2        2,644,000.00
Saraiva           2        2,293,000.00
Vargas            2        1,617,000.00
Ansman-Wolfe      3        1,183,000.00
Campbell          3        1,438,000.00
Mensa-Annan       3        1,481,000.00
Valdez            3        1,294,000.00
Abbas             4          172,000.00
Albert            4          651,000.00
Jiang             4          544,000.00
Tsoflias          4          867,000.00

D. Diviser le jeu de résultats à l’aide de PARTITION BY

L’exemple suivant ajoute l’argument PARTITION BY au code dans l’exemple A. Les lignes sont d’abord partitionnée SalesTerritoryCountry , puis divisées en deux groupes dans chacun d’eux SalesTerritoryCountry. Dans ORDER BY la OVER clause trie et NTILE l’instruction ORDER BY commande le jeu de SELECT résultats.

-- Uses AdventureWorks
SELECT e.LastName,
       NTILE(2) OVER (PARTITION BY e.SalesTerritoryKey ORDER BY SUM(SalesAmountQuota) DESC) AS Quartile,
       CONVERT (VARCHAR (13), SUM(SalesAmountQuota), 1) AS SalesQuota,
       st.SalesTerritoryCountry
FROM dbo.DimEmployee AS e
     INNER JOIN dbo.FactSalesQuota AS sq
         ON e.EmployeeKey = sq.EmployeeKey
     INNER JOIN dbo.DimSalesTerritory AS st
         ON e.SalesTerritoryKey = st.SalesTerritoryKey
WHERE sq.CalendarYear = 2003
GROUP BY e.LastName, e.SalesTerritoryKey, st.SalesTerritoryCountry
ORDER BY st.SalesTerritoryCountry, Quartile;

Voici le jeu de résultats.

LastName          Quartile SalesYTD       SalesTerritoryCountry
----------------- -------- -------------- ------------------
Tsoflias          1           867,000.00   Australia
Saraiva           1         2,293,000.00   Canada
Varkey Chudukatil 1         2,940,000.00   France
Valdez            1         1,294,000.00   Germany
Alberts           1           651,000.00   NA
Jiang             1           544,000.00   NA
Pak               1         5,142,000.00   United Kingdom
Mensa-Annan       1         1,481,000.00   United States
Campbell          1         1,438,000.00   United States
Reiter            1         2,768,000.00   United States
Blythe            1         4,716,000.00   United States
Carson            1         4,350,000.00   United States
Mitchell          1         4,682,000.00   United States
Vargas            2         1,617,000.00   Canada
Abbas             2           172,000.00   NA
Ito               2         2,644,000.00   United States
Ansman-Wolfe      2         1,183,000.00   United States