DENSE_RANK (T-SQL)
Berlaku untuk: Titik akhir analitik SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Platform System (PDW)
SQL di Microsoft Fabric
Warehouse di Microsoft Fabric
Fungsi ini mengembalikan peringkat setiap baris dalam partisi tataan hasil, tanpa celah dalam nilai peringkat. Peringkat baris tertentu adalah satu ditambah jumlah nilai peringkat berbeda yang datang sebelum baris tertentu.
Sintaksis
DENSE_RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > )
Catatan
Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.
Argumen
<partition_by_clause>
Pertama membagi tataan hasil yang dihasilkan oleh klausul FROM menjadi partisi, dan kemudian DENSE_RANK
fungsi diterapkan ke setiap partisi. Lihat Klausul OVER (Transact-SQL) untuk sintaks.PARTITION BY
<order_by_clause>
Menentukan urutan di mana DENSE_RANK
fungsi berlaku untuk baris dalam partisi.
Jenis Kembalian
bigint
Keterangan
Jika dua baris atau lebih memiliki nilai peringkat yang sama dalam partisi yang sama, masing-masing baris tersebut akan menerima peringkat yang sama. Misalnya, jika dua tenaga penjualan teratas memiliki nilai SalesYTD yang sama, keduanya akan memiliki nilai peringkat satu. Tenaga penjualan dengan SalesYTD tertinggi berikutnya akan memiliki nilai peringkat dua. Ini melebihi jumlah baris berbeda yang datang sebelum baris yang dimaksud oleh satu baris. Oleh karena itu, angka yang dikembalikan oleh DENSE_RANK
fungsi tidak memiliki celah, dan selalu memiliki nilai peringkat berturut-turut.
Urutan pengurutan yang digunakan untuk seluruh kueri menentukan urutan baris dalam tataan hasil. Ini menyiratkan bahwa baris berpangkat nomor satu tidak harus menjadi baris pertama dalam partisi.
DENSE_RANK
bersifat nondeterministik. Lihat Fungsi Deterministik dan Nondeterministik untuk informasi selengkapnya.
Contoh
J. Baris peringkat dalam partisi
Contoh ini memberi peringkat produk dalam inventori, oleh lokasi inventaris yang ditentukan, sesuai dengan jumlahnya. DENSE_RANK
mempartisi hasil yang ditetapkan oleh LocationID
dan secara logis mengurutkan hasil yang ditetapkan oleh Quantity
. Perhatikan bahwa produk 494 dan 495 memiliki kuantitas yang sama. Karena keduanya memiliki nilai kuantitas yang sama, keduanya memiliki nilai peringkat satu.
USE AdventureWorks2022;
GO
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity
,DENSE_RANK() OVER
(PARTITION BY i.LocationID ORDER BY i.Quantity DESC) AS Rank
FROM Production.ProductInventory AS i
INNER JOIN Production.Product AS p
ON i.ProductID = p.ProductID
WHERE i.LocationID BETWEEN 3 AND 4
ORDER BY i.LocationID;
GO
Berikut adalah hasil yang ditetapkan.
ProductID Name LocationID Quantity Rank
----------- ---------------------------------- ---------- -------- -----
494 Paint - Silver 3 49 1
495 Paint - Blue 3 49 1
493 Paint - Red 3 41 2
496 Paint - Yellow 3 30 3
492 Paint - Black 3 17 4
495 Paint - Blue 4 35 1
496 Paint - Yellow 4 25 2
493 Paint - Red 4 24 3
492 Paint - Black 4 14 4
494 Paint - Silver 4 12 5
(10 row(s) affected)
B. Memberi peringkat semua baris dalam tataan hasil
Contoh ini mengembalikan sepuluh karyawan teratas yang diberi peringkat berdasarkan gaji mereka. SELECT
Karena pernyataan tidak menentukan PARTITION BY
klausa, DENSE_RANK
fungsi diterapkan ke semua baris tataan hasil.
USE AdventureWorks2022;
GO
SELECT TOP(10) BusinessEntityID, Rate,
DENSE_RANK() OVER (ORDER BY Rate DESC) AS RankBySalary
FROM HumanResources.EmployeePayHistory;
Berikut adalah hasil yang ditetapkan.
BusinessEntityID Rate RankBySalary
---------------- --------------------- --------------------
1 125.50 1
25 84.1346 2
273 72.1154 3
2 63.4615 4
234 60.0962 5
263 50.4808 6
7 50.4808 6
234 48.5577 7
285 48.101 8
274 48.101 8
C. Empat fungsi peringkat yang digunakan dalam kueri yang sama
Contoh ini menunjukkan empat fungsi peringkat
digunakan dalam kueri yang sama. Lihat setiap fungsi peringkat untuk contoh khusus fungsi.
USE AdventureWorks2022;
GO
SELECT p.FirstName, p.LastName
,ROW_NUMBER() OVER (ORDER BY a.PostalCode) AS "Row Number"
,RANK() OVER (ORDER BY a.PostalCode) AS Rank
,DENSE_RANK() OVER (ORDER BY a.PostalCode) AS "Dense Rank"
,NTILE(4) OVER (ORDER BY a.PostalCode) AS Quartile
,s.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;
Berikut adalah hasil yang ditetapkan.
FirstName | LastName | Nomor Baris | Pangkat | Peringkat Padat | Kuartil | SalesYTD | PostalCode |
---|---|---|---|---|---|---|---|
Michael | Blythe | 1 | 1 | 1 | 1 | 4557045.0459 | 98027 |
Linda | Mitchell | 2 | 1 | 1 | 1 | 5200475.2313 | 98027 |
Jillian | Carson | 3 | 1 | 1 | 1 | 3857163.6332 | 98027 |
Garrett | Vargas | 4 | 1 | 1 | 1 | 1764938.9859 | 98027 |
Tsvi | Reiter | 5 | 1 | 1 | 2 | 2811012.7151 | 98027 |
Shu | Ito | 6 | 6 | 2 | 2 | 3018725.4858 | 98055 |
José | Saraiva | 7 | 6 | 2 | 2 | 3189356.2465 | 98055 |
David | Campbell | 8 | 6 | 2 | 3 | 3587378.4257 | 98055 |
Tete | Mensa-Annan | 9 | 6 | 2 | 3 | 1931620.1835 | 98055 |
Lynn | Tsoflias | 10 | 6 | 2 | 3 | 1758385.926 | 98055 |
Rachel | Valdez | 11 | 6 | 2 | 4 | 2241204.0424 | 98055 |
Jae | Pak | 12 | 6 | 2 | 4 | 5015682.3752 | 98055 |
Ranjit | Varkey Chudukatil | 13 | 6 | 2 | 4 | 3827950.238 | 98055 |
Contoh: Azure Synapse Analytics and Analytics Platform System (PDW)
D: Baris peringkat dalam partisi
Contoh ini memberi peringkat perwakilan penjualan di setiap wilayah penjualan sesuai dengan total penjualan mereka. DENSE_RANK
mempartisi set baris menurut SalesTerritoryGroup
, dan mengurutkan hasil yang ditetapkan oleh SalesAmountQuota
.
-- Uses AdventureWorks
SELECT LastName, SUM(SalesAmountQuota) AS TotalSales, SalesTerritoryGroup,
DENSE_RANK() OVER (PARTITION BY SalesTerritoryGroup ORDER BY SUM(SalesAmountQuota) DESC ) AS RankResult
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 SalesPersonFlag = 1 AND SalesTerritoryGroup != N'NA'
GROUP BY LastName, SalesTerritoryGroup;
Berikut adalah hasil yang ditetapkan.
LastName TotalSales SalesTerritoryGroup RankResult
---------------- ------------- ------------------- --------
Pak 10514000.0000 Europe 1
Varkey Chudukatil 5557000.0000 Europe 2
Valdez 2287000.0000 Europe 3
Carson 12198000.0000 North America 1
Mitchell 11786000.0000 North America 2
Blythe 11162000.0000 North America 3
Reiter 8541000.0000 North America 4
Ito 7804000.0000 North America 5
Saraiva 7098000.0000 North America 6
Vargas 4365000.0000 North America 7
Campbell 4025000.0000 North America 8
Ansman-Wolfe 3551000.0000 North America 9
Mensa-Annan 2753000.0000 North America 10
Tsoflias 1687000.0000 Pacific 1
Lihat Juga
RANK (T-SQL)
ROW_NUMBER (T-SQL)
NTILE (Transact-SQL)
Fungsi Peringkat (Transact-SQL)
Fungsi