Delen via


NTILE (Transact-SQL)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Distribueert de rijen in een geordende partitie in een opgegeven aantal groepen. De groepen worden genummerd, beginnend bij één. Retourneert voor elke rij NTILE het aantal groepen waartoe de rij behoort.

Transact-SQL syntaxis-conventies

Syntaxis

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

Arguments

integer_expression

Een positieve geheel getalexpressie waarmee het aantal groepen wordt opgegeven waarin elke partitie moet worden verdeeld. integer_expression kan van het type int of bigint zijn.

<partition_by_clause>

Verdeelt de resultatenset die wordt geproduceerd door de FROM-component plus JOIN, APPLY, PIVOT-component in partities waarop de functie wordt toegepast. Zie SELECT - OVER-component voor de PARTITION BY syntaxis.

<order_by_clause>

Bepaalt de volgorde waarin de NTILE waarden worden toegewezen aan de rijen in een partitie. Een geheel getal kan geen kolom vertegenwoordigen wanneer de <order_by_clause> wordt gebruikt in een classificatiefunctie.

Retourtypen

bigint

Opmerkingen

Als het aantal rijen in een partitie niet deelbaar is door integer_expression, veroorzaakt dit groepen van twee grootten die per lid verschillen. Grotere groepen worden geleverd vóór kleinere groepen in de volgorde die is opgegeven door de OVER component. Als het totale aantal rijen bijvoorbeeld 53 is en het aantal groepen vijf is, hebben de eerste drie groepen 11 rijen en hebben de twee resterende groepen elk 10 rijen. Als het totale aantal rijen daarentegen deelbaar is door het aantal groepen, worden de rijen gelijkmatig verdeeld over de groepen. Als het totale aantal rijen bijvoorbeeld 50 is en er vijf groepen zijn, bevat elke bucket 10 rijen.

NTILE is niet-deterministisch. Zie Deterministische en niet-deterministische functies voor meer informatie.

Voorbeelden

De codevoorbeelden in dit artikel gebruiken de AdventureWorks2022 of AdventureWorksDW2022 voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .

Opmerking

In de volgende voorbeelden wordt de functie CONVERTEREN gebruikt om de SalesYTD gegevens als valuta op te maken.

Eén. Rijen verdelen in groepen

In het volgende voorbeeld worden rijen onderverdeeld in vier groepen werknemers op basis van hun jaar tot heden verkoop. Omdat het totale aantal rijen niet deelbaar is door het aantal groepen, hebben de eerste twee groepen vier rijen en hebben de resterende groepen elk drie rijen.

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

Hier is het resultatenoverzicht.

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. De resultatenset delen met PARTITION BY

In het volgende voorbeeld wordt het PARTITION BY argument toegevoegd aan de code in voorbeeld A. De rijen worden eerst gepartitioneerd en PostalCode vervolgens onderverdeeld in vier groepen binnen elke PostalCode. Het voorbeeld declareert ook een variabele @NTILE_Var en gebruikt die variabele om de waarde voor de parameter integer_expression op te geven.

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

Hier is het resultatenoverzicht.

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

Voorbeelden: Azure Synapse Analytics and Analytics Platform System (PDW)

C. Rijen verdelen in groepen

In het volgende voorbeeld wordt de NTILE functie gebruikt om een set verkopers in vier groepen te verdelen op basis van hun toegewezen verkoopquotum voor het jaar 2003. Omdat het totale aantal rijen niet deelbaar is door het aantal groepen, heeft de eerste groep vijf rijen en de resterende groepen elk vier rijen.

-- 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;

Hier is het resultatenoverzicht.

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. De resultatenset delen met PARTITION BY

In het volgende voorbeeld wordt het PARTITION BY argument toegevoegd aan de code in voorbeeld A. De rijen worden eerst gepartitioneerd door SalesTerritoryCountry en vervolgens onderverdeeld in twee groepen binnen elke SalesTerritoryCountry. In ORDER BY de OVER component worden de NTILE resultatenset door de en de ORDER BYSELECT instructie besteld.

-- 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;

Hier is het resultatenoverzicht.

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