Aracılığıyla paylaş


NTILE (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalitik Platform Sistemi (PDW)Microsoft Fabric'te SQL veritabanı

Sıralı bir bölümdeki satırları belirtilen sayıda gruba dağıtır. Gruplar numaralandırılır ve bunlardan biri başlar. Her satır için, NTILE satırın ait olduğu grubun sayısını döndürür.

Transact-SQL söz dizimi kuralları

Sözdizimi

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

Arguments

integer_expression

Her bölümün bölünmesi gereken grup sayısını belirten pozitif bir tamsayı ifadesi. integer_expressionint veya bigint türünde olabilir.

<partition_by_clause>

FROM yan tümcesi artı JOIN, APPLY, PIVOT yan tümcesi tarafından üretilen sonuç kümesini işlevin uygulandığı bölümlere böler. Söz dizimi için PARTITION BY bkz. SELECT - OVER yan tümcesi.

<order_by_clause>

Değerlerin bir bölümdeki NTILE satırlara atanma sırasını belirler. Bir sıralama işlevinde <order_by_clause> kullanıldığında bir tamsayı sütunu temsil edebilir.

Dönüş türleri

bigint

Açıklamalar

Bir bölümdeki satır sayısı integer_expression göre bölünemiyorsa, bu durum bir üyeye göre farklılık gösteren iki boyutlu gruplara neden olur. Büyük gruplar, yan tümcesi tarafından belirtilen sırada daha küçük gruplara gelir OVER . Örneğin, toplam satır sayısı 53 ve grup sayısı beş ise, ilk üç grubun 11 satırı ve kalan iki grubun her biri 10 satırı vardır. Diğer taraftan, toplam satır sayısı grup sayısına göre bölünebiliyorsa, satırlar gruplar arasında eşit olarak dağıtılır. Örneğin, toplam satır sayısı 50 ise ve beş grup varsa, her demet 10 satır içerir.

NTILE belirsiz değildir. Daha fazla bilgi için bkz . Deterministic ve nondeterministic functions.

Örnekler

Bu makaledeki kod örnekleri, AdventureWorks2025 giriş sayfasından indirebileceğiniz veya AdventureWorksDW2025 örnek veritabanını kullanır.

Uyarı

Aşağıdaki örneklerde, convert işlevi verileri para birimi olarak biçimlendirmek SalesYTD için kullanılır.

A. Satırları gruplara bölme

Aşağıdaki örnek satırları, yıllık satışlarına göre dört çalışan grubuna böler. Toplam satır sayısı grup sayısına göre bölünemediğinden, ilk iki grubun dört satırı ve kalan grupların her birinde üç satır vardır.

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

Sonuç kümesi aşağıdadır.

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. PARTITION BY kullanarak sonuç kümesini bölme

Aşağıdaki örnek, A örneğindeki koda bağımsız değişkenini ekler PARTITION BY . Satırlar önce tarafından PostalCode bölümlenir ve ardından her PostalCodeiçinde dört gruba ayrılır. Örnek ayrıca bir değişken @NTILE_Var bildirir ve integer_expression parametresinin değerini belirtmek için bu değişkeni kullanır.

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

Sonuç kümesi aşağıdadır.

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

Örnekler: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)

C. Satırları gruplara bölme

Aşağıdaki örnek, 2003 yılı için atanan satış kotasına göre bir satış temsilcisi kümesini dört gruba bölmek için işlevini kullanır NTILE . Toplam satır sayısı grup sayısına göre bölünemediğinden, ilk grubun beş satırı ve kalan grupların her birinde dört satır vardır.

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

Sonuç kümesi aşağıdadır.

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. PARTITION BY kullanarak sonuç kümesini bölme

Aşağıdaki örnek, A örneğindeki koda bağımsız değişkenini ekler PARTITION BY . Satırlar önce tarafından SalesTerritoryCountry bölümlenir ve ardından her SalesTerritoryCountryiçinde iki gruba ayrılır. ORDER BY in yan tümcesiOVER, deyiminin NTILE ve ORDER BYSELECT öğesini sipariş ederek sonuç kümesini sıralar.

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

Sonuç kümesi aşağıdadır.

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