Bagikan melalui


NTILE (Transact-SQL)

Berlaku untuk: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

Mendistribusikan baris dalam partisi yang diurutkan ke dalam jumlah grup tertentu. Grup diberi nomor, mulai dari satu. Untuk setiap baris, NTILE mengembalikan jumlah grup tempat baris berada.

Konvensi sintaks transact-SQL

Sintaks

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

Argumen

integer_expression
Adalah ekspresi bilangan bulat positif yang menentukan jumlah grup tempat setiap partisi harus dibagi. integer_expression bisa berjenis int, atau bigint.

<partition_by_clause>
Membagi tataan hasil yang dihasilkan oleh klausul FROM menjadi partisi tempat fungsi diterapkan. Untuk sintaks PARTITION BY, lihat Klausul OVER (Transact-SQL).

<order_by_clause>
Menentukan urutan penetapan nilai NTILE ke baris dalam partisi. Bilangan bulat tidak dapat mewakili kolom saat <order_by_clause> digunakan dalam fungsi peringkat.

Jenis Kembalian

bigint

Keterangan

Jika jumlah baris dalam partisi tidak dapat dibagi berdasarkan integer_expression, ini akan menyebabkan grup dengan dua ukuran yang berbeda dengan satu anggota. Grup yang lebih besar datang sebelum grup yang lebih kecil dalam urutan yang ditentukan oleh klausa OVER. Misalnya jika jumlah total baris adalah 53 dan jumlah grup adalah lima, tiga grup pertama akan memiliki 11 baris dan dua grup yang tersisa masing-masing akan memiliki 10 baris. Jika di sisi lain jumlah total baris dapat dibagi berdasarkan jumlah grup, baris akan didistribusikan secara merata di antara grup. Misalnya, jika jumlah total baris adalah 50, dan ada lima grup, setiap wadah akan berisi 10 baris.

NTILE bersifat nondeterministik. Untuk informasi selengkapnya, lihat Fungsi Deterministik dan Nondeterministik.

Contoh

J. Membalikan baris menjadi grup

Contoh berikut membagi baris menjadi empat grup karyawan berdasarkan penjualan tahunan hingga saat ini. Karena jumlah total baris tidak dapat dibagi berdasarkan jumlah grup, dua grup pertama memiliki empat baris dan grup yang tersisa masing-masing memiliki tiga baris.

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  

Berikut set hasilnya.

  
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  

(14 row(s) affected)  

B. Membalah hasil yang ditetapkan dengan menggunakan PARTITION BY

Contoh berikut menambahkan PARTITION BY argumen ke kode dalam contoh A. Baris pertama kali dipartisi oleh PostalCode dan kemudian dibagi menjadi empat grup dalam masing-masing PostalCode. Contoh ini juga mendeklarasikan variabel @NTILE_Var dan menggunakan variabel tersebut untuk menentukan nilai untuk parameter integer_expression .

USE AdventureWorks2022;  
GO  
DECLARE @NTILE_Var 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  

Berikut set hasilnya.

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  
  
(14 row(s) affected)  

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

C. Membalikan baris menjadi grup

Contoh berikut menggunakan fungsi NTILE untuk membagi satu set tenaga penjual menjadi empat grup berdasarkan kuota penjualan yang ditetapkan untuk tahun 2003. Karena jumlah total baris tidak dapat dibagi berdasarkan jumlah grup, grup pertama memiliki lima baris dan grup yang tersisa masing-masing memiliki empat baris.

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

Berikut set hasilnya.

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. Membalah hasil yang ditetapkan dengan menggunakan PARTITION BY

Contoh berikut menambahkan argumen PARTITION BY ke kode dalam contoh A. Baris pertama kali dipartisi oleh SalesTerritoryCountry dan kemudian dibagi menjadi dua grup dalam masing-masing SalesTerritoryCountry. Perhatikan bahwa ORDER BY dalam klausul OVER mengurutkan NTILE dan ORDER BY dari pernyataan SELECT mengurutkan tataan hasil.

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

Berikut set hasilnya.

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

Lihat Juga

RANK (T-SQL)
DENSE_RANK (T-SQL)
ROW_NUMBER (T-SQL)
Fungsi Peringkat (Transact-SQL)
Fungsi Bawaan (Transact-SQL)