Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics 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