Bagikan melalui


RANK (T-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistem Platform Analitik (PDW)Titik akhir analitik SQL di Microsoft FabricGudang di Microsoft FabricDatabase SQL 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 angka semua baris secara berurutan (misalnya 1, 2, 3, 4, 5). RANK memberikan 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 IDENTITY (Properti) dan BUAT URUTAN.

Konvensi sintaks transact-SQL

Sintaks

RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )

Argumen

LEBIH ( [ partition_by_clause ] order_by_clause )

partition_by_clause membagi kumpulan hasil yang dihasilkan oleh FROM klausa ke dalam 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 <rows or range clause> tidak OVER dapat ditentukan untuk RANK fungsi. Untuk informasi selengkapnya, lihat klausa SELECT - OVER.

Tipe pengembalian

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 yang sama SalesYTD , keduanya berada di peringkat satu. Penjual dengan peringkat tertinggi SalesYTD berikutnya adalah peringkat nomor tiga, karena ada dua baris yang memiliki peringkat lebih tinggi. Oleh karena itu, fungsi tidak RANK selalu mengembalikan bilangan bulat berurutan.

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

Sampel kode dalam artikel ini menggunakan database sampel AdventureWorks2025 atau AdventureWorksDW2025, yang dapat Anda unduh dari halaman beranda Sampel dan Proyek Komunitas Microsoft SQL Server.

J. Peringkat baris 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. Di lokasi 3, produk 494 dan 495 memiliki jumlah yang sama. Karena mereka seri, mereka berdua berada di peringkat satu.

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

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

B. Memberi peringkat semua baris dalam kumpulan hasil

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

USE AdventureWorks2025;
GO

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 e.LastName,
       st.SalesTerritoryGroup,
       SUM(sq.SalesAmountQuota) AS TotalSales,
       RANK() OVER (PARTITION BY st.SalesTerritoryGroup ORDER BY SUM(sq.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 e.SalesPersonFlag = 1
      AND st.SalesTerritoryGroup <> N'NA'
GROUP BY e.LastName, st.SalesTerritoryGroup;

Berikut set hasilnya.

LastName           SalesTerritoryGroup  TotalSales   RankResult
------------------ -------------------- ------------ -----------
Pak                Europe               10514000.00  1
Varkey Chudukatil  Europe               5557000.00   2
Valdez             Europe               2287000.00   3
Carson             North America        12198000.00  1
Mitchell           North America        11786000.00  2
Blythe             North America        11162000.00  3
Reiter             North America        8541000.00   4
Ito                North America        7804000.00   5
Saraiva            North America        7098000.00   6
Vargas             North America        4365000.00   7
Campbell           North America        4025000.00   8
Ansman-Wolfe       North America        3551000.00   9
Mensa-Annan        North America        2753000.00   10
Tsoflias           Pacific              1687000.00   1