Aracılığıyla paylaş


DENSE_RANK (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnaliz Platformu Sistemi (PDW)Microsoft Fabric'teki SQL analiz uç noktasıMicrosoft Fabric'teki ambarMicrosoft Fabric'teki SQL veritabanı

Bu fonksiyon, sıralama değerlerinde boşluk olmadan bir sonuç kümesi bölümündeki her satırın sıralamasını döndürür. Belirli bir sıranın sıralaması, o satırdan önce gelen farklı sıralama değerlerinin sayısı artı bir artıdır.

Transact-SQL söz dizimi kuralları

Sözdizimi

DENSE_RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > )  

Arguments

<partition_by_clause>
Önce FROM cümlesi tarafından üretilen sonuç kümesini bölümlere böler, ardından DENSE_RANK fonksiyon her bölüme uygulanır. Sözdizimi için PARTITION BYOVER Maddesi (Transact-SQL) bkz.

<order_by_clause>
Fonksiyonun DENSE_RANK bir bölümdeki satırlara uygulanma sırasını belirler.

Dönüş Türleri

bigint

Açıklamalar

Eğer iki veya daha fazla satır aynı bölümde aynı sıraya sahipse, her bir satır aynı sırayı alır. Örneğin, en iyi iki satış görevlisinin SalesYTD değeri aynıysa, ikisinin de bir sıralama değeri olur. Bir sonraki en yüksek SalesYTD puanına sahip satıcının sıralama değeri iki olacaktır. Bu, söz konusu satırdan önceki farklı satır sayısını bir kat aşar. Bu nedenle, fonksiyonun döndürdüğü DENSE_RANK sayıların boşlukları yoktur ve her zaman ardışık sıralama değerleri vardır.

Tüm sorgu için kullanılan sıralama sırası, sonuç kümesindeki satır sırasını belirler. Bu, birinci sırada sıralanan bir satırın bölümde ilk sıra olması gerekmediği anlamına gelir.

DENSE_RANK belirsiz değildir. Daha fazla bilgi için Deterministik ve Belirsiz Fonksiyonlar sayfasına bakınız.

Örnekler

A. Bir bölüm içindeki sıraları sıralamak

Bu örnek, envanterdeki ürünleri belirtilen envanter konumlarına göre, miktarlarına göre sıralar. DENSE_RANK Sonuç kümesini böler LocationID ve mantıken sonuç kümesini 'ye göre Quantitysıralar. 494 ve 495 ürünlerinin aynı miktara sahip olduğunu fark edin. İkisi de aynı miktar değerine sahip olduğu için, ikisinin de bir değer değeri vardır.

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  

Sonuç kümesi aşağıdadır.

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. Sonuç kümesindeki tüm sıraları sıralama

Bu örnek, maaşlarına göre sıralanmış en iyi on çalışanı geri getirir. Cümle SELECT bir PARTITION BY madde belirtmediği için, DENSE_RANK fonksiyon tüm sonuç kümesi satırlarına uygulanmıştır.

USE AdventureWorks2022;  
GO  
SELECT TOP(10) BusinessEntityID, Rate,   
       DENSE_RANK() OVER (ORDER BY Rate DESC) AS RankBySalary  
FROM HumanResources.EmployeePayHistory;  

Sonuç kümesi aşağıdadır.

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. Aynı sorguda kullanılan dört sıralama fonksiyonu

Bu örnek, dört sıralama fonksiyonunu göstermektedir

aynı sorguda kullanıldı. Her bir sıralama fonksiyonuna fonksiyona özel örnekler için bakınız.

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;  

Sonuç kümesi aşağıdadır.

İlk İsim Soyadı Satır Numarası Sıralama Yoğun Rütbe Dörttebirlik SatışYTD Posta Kodu
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 Çalışkan 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 Vural 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

Örnekler: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)

D: Bir bölüm içindeki sıraları sıralamak

Bu örnek, her satış bölgesindeki satış temsilcilerini toplam satışlarına göre sıralar. DENSE_RANK Satır kümesini ile SalesTerritoryGroupböler ve sonuç kümesini 'ye göre SalesAmountQuotasıralar.

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

Sonuç kümesi aşağıdadır.

 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 

Ayrıca Bkz.

RÜTBE (Transact-SQL)
ROW_NUMBER (Transact-SQL)
NTILE (Transact-SQL)
Derecelendirme İşlevleri (Transact-SQL)
Functions