Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Distribuerar raderna i en ordnad partition till ett angivet antal grupper. Grupperna är numrerade, med början vid ett. För varje rad NTILE returneras numret för den grupp som raden tillhör.
Transact-SQL syntaxkonventioner
Syntax
NTILE (integer_expression) OVER ( [ <partition_by_clause> ] <order_by_clause> )
Arguments
integer_expression
Ett positivt heltalsuttryck som anger antalet grupper som varje partition måste delas upp i. integer_expression kan vara av typen int eller bigint.
<partition_by_clause>
Delar upp resultatuppsättningen som skapas av FROM-satsen plus JOIN, APPLY, PIVOT-satsen i partitioner som funktionen tillämpas på. Syntaxen finns i PARTITION BYSELECT - OVER-satsen.
<order_by_clause>
Avgör i vilken NTILE ordning värdena tilldelas till raderna i en partition. Ett heltal kan inte representera en kolumn när order_by_clause <> används i en rangordningsfunktion.
Returtyper
bigint
Anmärkningar
Om antalet rader i en partition inte kan delas av integer_expression orsakar detta grupper med två storlekar som skiljer sig mellan en medlem. Större grupper kommer före mindre grupper i den ordning som anges av OVER -satsen. Om det totala antalet rader till exempel är 53 och antalet grupper är fem, har de tre första grupperna 11 rader och de två återstående grupperna har 10 rader vardera. Om det totala antalet rader däremot är delbart med antalet grupper fördelas raderna jämnt mellan grupperna. Om det totala antalet rader till exempel är 50 och det finns fem grupper innehåller varje bucket 10 rader.
NTILE är nondeterministisk. Mer information finns i Deterministiska och icke-terministiska funktioner.
Examples
Kodexemplen i den här artikeln använder exempeldatabasen AdventureWorks2022 eller AdventureWorksDW2022 som du kan ladda ned från startsidan för Microsoft SQL Server-exempel och Community Projects .
Anmärkning
I följande exempel används funktionen CONVERT för att formatera SalesYTD data som valuta.
A. Dela upp rader i grupper
I följande exempel delas rader in i fyra grupper med anställda baserat på deras hittills försäljning hittills i år. Eftersom det totala antalet rader inte är delbart med antalet grupper, har de två första grupperna fyra rader och de återstående grupperna har tre rader vardera.
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
Här är resultatet.
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. Dela upp resultatuppsättningen med hjälp av PARTITION BY
I följande exempel läggs PARTITION BY argumentet till i koden i exempel A. Raderna partitioneras först av PostalCode och delas sedan in i fyra grupper inom varje PostalCode. Exemplet deklarerar också en variabel @NTILE_Var och använder variabeln för att ange värdet för parametern 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
Här är resultatet.
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
Exempel: Azure Synapse Analytics and Analytics Platform System (PDW)
C. Dela upp rader i grupper
I följande exempel används NTILE funktionen för att dela upp en uppsättning säljare i fyra grupper baserat på deras tilldelade försäljningskvot för år 2003. Eftersom det totala antalet rader inte är delbart med antalet grupper, har den första gruppen fem rader och de återstående grupperna har fyra rader vardera.
-- 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;
Här är resultatet.
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. Dela upp resultatuppsättningen med hjälp av PARTITION BY
I följande exempel läggs PARTITION BY argumentet till i koden i exempel A. Raderna partitioneras först av SalesTerritoryCountry och delas sedan in i två grupper inom varje SalesTerritoryCountry.
ORDER BY I-satsen OVER beställer NTILE och ORDER BY för -instruktionen SELECT order resultatuppsättningen.
-- 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;
Här är resultatet.
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