Bagikan melalui


DENSE_RANK (T-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)Titik akhir analitik SQL di Microsoft FabricWarehouse 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.

Konvensi sintaks transact-SQL

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