Dela via


NTILE (Transact-SQL)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics 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