RANK (Transact-sql)

Sonuç kümesindeki her satırı bölüm içerisinde verir. Satır sırası satırdan önce söz konusu gelir sırada sayısı artı biri olduğunu.

Konu bağlantısı simgesi Transact-SQL Sözdizim Kuralları

Sözdizimi

RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )

Bağımsız değişkenler

  • OVER (partition_by_clauseorder_by_clause)
    partition_by_clausefrom yan tümcesi tarafından üretilen işlevinin uygulandığı bölümler halinde sonuç kümesi ayırır. Belirtilmemişse, işlev tüm satırları sorgu sonuç kümesinde tek Grup olarak davranır. order_by_clauseişlevi uygulanmadan önce verilerin sırasını belirler. order_by_clauseGerekiyor. <Satır veya aralığı yan> üzerinde sıralama işlevi için yan tümcesi belirtilemez. Daha fazla bilgi için, bkz. Yan (Transact-sql).

Dönüş Türleri

bigint

Açıklamalar

İki veya daha fazla satır sıralaması için kravat bağlı her satır alır aynı değerde. Örneğin, eğer iki en iyi satıcıyı aynı SalesYTDdeğeri iki sıralama bir. Satış Temsilcisi ile sonraki en yüksek SalesYTDçünkü yüksek sıralanır iki satır sayısı üç, sıralanır. Bu nedenle, rank işlevi ardışık tamsayıların hep döndürmez.

Tüm sorgu için kullanılan sıralama düzeni satırları sonuç kümesinde görünme sırasını belirler.

Örnekler

A.Bir bölüm içindeki satırları sıralama

Aşağıdaki örnek, belirtilen stok yerlere onların miktarlarına göre stoktaki ürünler yer alıyor. Sonuç kümesi tarafından bölümlendirilir LocationIDve mantıklı tarafından sipariş Quantity. 494 Ve 495 ürününün aynı miktarı olduğunu fark. Onlar bağlı olduğundan, bunların her ikisi de bir sıralanır.

USE AdventureWorks2012;
GO
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity
    ,RANK() OVER 
    (PARTITION BY i.LocationID ORDER BY i.Quantity DESC) AS 'Rank'
FROM Production.ProductInventory i 
INNER JOIN Production.Product p 
    ON i.ProductID = p.ProductID
WHERE i.LocationID BETWEEN 3 AND 4
ORDER BY i.LocationID;
GO

USE AdventureWorks2012;
GO
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity
    ,RANK() OVER 
    (PARTITION BY i.LocationID ORDER BY i.Quantity DESC) AS 'Rank'
FROM Production.ProductInventory i 
INNER JOIN Production.Product p 
    ON i.ProductID = p.ProductID
WHERE i.LocationID BETWEEN 3 AND 4
ORDER BY i.LocationID;
GO

Sonuç kümesi buradadır.

ProductID   Name                   LocationID   Quantity Rank
----------- ---------------------- ------------ -------- ----
494         Paint - Silver         3            49       1
495         Paint - Blue           3            49       1
493         Paint - Red            3            41       3
496         Paint - Yellow         3            30       4
492         Paint - Black          3            17       5
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)

ProductID   Name                   LocationID   Quantity Rank
----------- ---------------------- ------------ -------- ----
494         Paint - Silver         3            49       1
495         Paint - Blue           3            49       1
493         Paint - Red            3            41       3
496         Paint - Yellow         3            30       4
492         Paint - Black          3            17       5
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 satırları sıralama

Aşağıdaki örnek, üst on çalışanları tarafından kendi maaş sırada verir. Bir bölümü tarafından yan belirtilmemiş olduğundan, sonuç kümesindeki tüm satırları sıralama işlevi uygulandığı.

USE AdventureWorks2012
SELECT TOP(10) BusinessEntityID, Rate, 
       RANK() OVER (ORDER BY Rate DESC) AS RankBySalary
FROM HumanResources.EmployeePayHistory AS eph1
WHERE RateChangeDate = (SELECT MAX(RateChangeDate) 
                        FROM HumanResources.EmployeePayHistory AS eph2
                        WHERE eph1.BusinessEntityID = eph2.BusinessEntityID)
ORDER BY BusinessEntityID;

USE AdventureWorks2012
SELECT TOP(10) BusinessEntityID, Rate, 
       RANK() OVER (ORDER BY Rate DESC) AS RankBySalary
FROM HumanResources.EmployeePayHistory AS eph1
WHERE RateChangeDate = (SELECT MAX(RateChangeDate) 
                        FROM HumanResources.EmployeePayHistory AS eph2
                        WHERE eph1.BusinessEntityID = eph2.BusinessEntityID)
ORDER BY BusinessEntityID;

Sonuç kümesi buradadır.

BusinessEntityID Rate                  RankBySalary
---------------- --------------------- --------------------
1                125.50                1
2                63.4615               4
3                43.2692               8
4                29.8462               19
5                32.6923               16
6                32.6923               16
7                50.4808               6
8                40.8654               10
9                40.8654               10
10               42.4808               9

BusinessEntityID Rate                  RankBySalary
---------------- --------------------- --------------------
1                125.50                1
2                63.4615               4
3                43.2692               8
4                29.8462               19
5                32.6923               16
6                32.6923               16
7                50.4808               6
8                40.8654               10
9                40.8654               10
10               42.4808               9

Ayrıca bkz.

Başvuru

dense_rank (Transact-sql)

ROW_NUMBER (Transact-SQL)

NTILE (Transact-sql)

Sıralama işlevleri (Transact-sql)

Yerleşik İşlevler (Transact-SQL)