Bagikan melalui


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

Mengembalikan peringkat setiap baris dalam partisi kumpulan hasil. Peringkat baris adalah satu ditambah jumlah peringkat yang datang sebelum baris yang dimaksud.

ROW_NUMBER dan RANK serupa. ROW_NUMBER nomor semua baris secara berurutan (misalnya 1, 2, 3, 4, 5). RANK menyediakan nilai numerik yang sama untuk ikatan (misalnya 1, 2, 2, 4, 5).

Catatan

RANK adalah nilai sementara yang dihitung saat kueri dijalankan. Untuk mempertahankan angka dalam tabel, lihat Properti IDENTITY dan URUTAN.

Konvensi sintaks transact-SQL

Sintaks

RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )  

Argumen

OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause membagi tataan hasil yang dihasilkan oleh klausul FROM menjadi partisi tempat fungsi diterapkan. Jika tidak ditentukan, fungsi memperlakukan semua baris hasil kueri yang ditetapkan sebagai grup tunggal. order_by_clause menentukan urutan data sebelum fungsi diterapkan. Order_by_clause diperlukan. Klausa <baris atau rentang/> klausa OVER tidak dapat ditentukan untuk fungsi RANK. Untuk informasi selengkapnya, lihat Klausul OVER (Transact-SQL).

Jenis Kembalian

bigint

Keterangan

Jika dua baris atau lebih mengikat untuk peringkat, setiap baris terikat menerima peringkat yang sama. Misalnya, jika dua tenaga penjualan teratas memiliki nilai SalesYTD yang sama, keduanya diberi peringkat satu. Tenaga penjualan dengan SalesYTD tertinggi berikutnya berada di peringkat tiga, karena ada dua baris yang peringkatnya lebih tinggi. Oleh karena itu, fungsi RANK tidak selalu mengembalikan bilangan bulat berturut-turut.

Urutan pengurutan yang digunakan untuk seluruh kueri menentukan urutan munculnya baris dalam tataan hasil.

RANK bersifat nondeterministik. Untuk informasi selengkapnya, lihat Fungsi Deterministik dan Nondeterministik.

Contoh

J. Baris peringkat dalam partisi

Contoh berikut memberi peringkat produk dalam inventarisi lokasi inventaris yang ditentukan sesuai dengan jumlahnya. Kumpulan hasil dipartisi oleh LocationID dan secara logis diurutkan oleh Quantity. Perhatikan bahwa produk 494 dan 495 memiliki kuantitas yang sama. Karena mereka terikat, keduanya berpangkat satu.

USE AdventureWorks2022;  
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 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 set hasilnya.

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. Memberi peringkat semua baris dalam tataan hasil

Contoh berikut mengembalikan sepuluh karyawan teratas yang diberi peringkat berdasarkan gaji mereka. Karena klausa PARTITION BY tidak ditentukan, fungsi RANK diterapkan ke semua baris dalam tataan hasil.

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

Berikut set hasilnya.

BusinessEntityID Rate                  RankBySalary  
---------------- --------------------- --------------------  
1                125.50                1  
2                63.4615               4  
3                43.2692               11  
4                29.8462               28  
5                32.6923               22  
6                32.6923               22  
7                50.4808               6  
8                40.8654               14  
9                40.8654               14  
10               42.4808               13  

Contoh: Azure Synapse Analytics and Analytics Platform System (PDW)

C: Baris peringkat dalam partisi

Contoh berikut memberi peringkat perwakilan penjualan di setiap wilayah penjualan sesuai dengan total penjualan mereka. Himpunan baris dipartisi berdasarkan SalesTerritoryGroup dan diurutkan menurut SalesAmountQuota.

-- Uses AdventureWorks  
  
SELECT LastName, SUM(SalesAmountQuota) AS TotalSales, SalesTerritoryRegion,  
    RANK() OVER (PARTITION BY SalesTerritoryRegion 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 SalesTerritoryRegion != N'NA'  
GROUP BY LastName, SalesTerritoryRegion;  

Berikut set hasilnya.

LastName          TotalSales     SalesTerritoryRegion  RankResult
----------------  -------------  -------------------  --------
Tsoflias          1687000.0000   Australia            1
Saraiva           7098000.0000   Canada               1
Vargas            4365000.0000   Canada               2
Carson            12198000.0000  Central              1
Varkey Chudukatil 5557000.0000   France               1
Valdez            2287000.0000   Germany              1
Blythe            11162000.0000  Northeast            1
Campbell          4025000.0000   Northwest            1
Ansman-Wolfe      3551000.0000   Northwest            2
Mensa-Annan       2753000.0000   Northwest            3
Reiter            8541000.0000   Southeast            1
Mitchell          11786000.0000  Southwest            1
Ito               7804000.0000   Southwest            2
Pak               10514000.0000  United Kingdom       1

Lihat Juga

DENSE_RANK (T-SQL)
ROW_NUMBER (T-SQL)
NTILE (Transact-SQL)
Fungsi Peringkat (Transact-SQL)
Fungsi Bawaan (Transact-SQL)