Bagikan melalui


NTILE (Transact-SQL)

Berlaku untuk:SQL ServerDatabase Azure SQLInstans Terkelola Azure SQLAzure Synapse AnalyticsSistem Platform Analitik (PDW)Database SQL di Microsoft Fabric

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

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 ditambah klausul JOIN, APPLY, PIVOT menjadi partisi tempat fungsi diterapkan. Untuk sintaks, PARTITION BY lihat klausa SELECT - OVER.

<order_by_clause>

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

Tipe pengembalian

bigint

Keterangan

Jika jumlah baris dalam partisi tidak dapat dibagi berdasarkan integer_expression, ini 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 OVER klausa. Misalnya, jika jumlah total baris adalah 53 dan jumlah grup adalah lima, tiga grup pertama memiliki 11 baris dan dua grup yang tersisa masing-masing memiliki 10 baris. Jika di sisi lain jumlah total baris dapat dibagi berdasarkan jumlah grup, baris didistribusikan secara merata di antara grup. Misalnya, jika jumlah total baris adalah 50, dan ada lima grup, setiap wadah berisi 10 baris.

NTILE bersifat nondeterministik. Untuk informasi selengkapnya, lihat Fungsi deterministik dan nondeterministik.

Contoh

Sampel kode dalam artikel ini menggunakan AdventureWorks2025 database sampel atau AdventureWorksDW2025 , yang dapat Anda unduh dari beranda Sampel Microsoft SQL Server dan Proyek Komunitas .

Nota

Dalam contoh berikut, fungsi CONVERT digunakan untuk memformat SalesYTD data sebagai mata uang.

J. Membagi 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

B. Membagi 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 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

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

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

C. Membagi baris menjadi grup

Contoh berikut menggunakan NTILE fungsi 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. Membagi hasil yang ditetapkan dengan menggunakan PARTITION BY

Contoh berikut menambahkan PARTITION BY argumen ke kode dalam contoh A. Baris pertama kali dipartisi oleh SalesTerritoryCountry dan kemudian dibagi menjadi dua grup dalam masing-masing SalesTerritoryCountry. ORDER BY dalam OVER klausa mengurutkan NTILE dan ORDER BY 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