Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk:SQL Server
Database Azure
SQLInstans
Terkelola Azure SQLAzure Synapse Analytics
Sistem 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.
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