Aracılığıyla paylaş


ROW_NUMBER (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ı

Bir sonuç kümesinin çıktısını sayılar. Daha spesifik olarak, bir sonuç kümesinin bir bölümü içindeki sıralı sayıyı döndürür; her bölümün ilk satırı için 1'den başlar.

ROW_NUMBER ve RANK benzerler. ROW_NUMBER tüm satırları sırayla numaralandırır (örneğin 1, 2, 3, 4, 5). RANK beraberlikler için aynı sayısal değeri sağlar (örneğin 1, 2, 2, 4, 5).

Uyarı

ROW_NUMBER sorgu çalıştırıldığında hesaplanan geçici bir değerdir. Bir tabloda sayıları kalıcı tutmak için IDENTITY Property ve SEQUENCE'e bakınız.

Transact-SQL söz dizimi kuralları

Sözdizimi

ROW_NUMBER ( )   
    OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )  

Arguments

BÖLÜMLEME value_expression
FROM cümlesinin ürettiği sonuç kümesini, ROW_NUMBER fonksiyonunun uygulandığı bölümlere böler. value_expression , sonuç kümesinin bölündüğü sütunu belirtir. Belirtilmediyse PARTITION BY , fonksiyon sorgu sonuç kümesinin tüm satırlarını tek bir grup olarak ele alır. Daha fazla bilgi için bkz. OVER Maddesi (Transact-SQL).

order_by_clause
Bu cümle ORDER BY , satırların belirli bir bölüm içinde benzersiz ROW_NUMBER olarak atanan sırasını belirler. Bu gereklidir. Daha fazla bilgi için bkz. OVER Maddesi (Transact-SQL).

Dönüş Türleri

bigint

Genel Açıklamalar

Aşağıdaki koşullar geçerli olmadıkça, bir sorgu kullanılarak ROW_NUMBER() döndürülen satırların, her yürütmede tamamen aynı sıralanmış olacağına dair hiçbir garanti yoktur.

  • Bölünmüş sütunun değerleri benzersizdir.

  • Sütunların ORDER BY değerleri benzersizdir.

  • Bölüm sütunu ve ORDER BY sütunlarının değer kombinasyonları benzersizdir.

Eğer sütunlar ORDER BY sonuçlar içinde benzersiz değilse, veya DENSE_RANK()veya kullanmayı düşününRANK().

ROW_NUMBER() belirsiz değildir. Daha fazla bilgi için bkz . Deterministic ve Nondeterministic Functions.

Örnekler

A. Basit örnekler

Aşağıdaki sorgu, dört sistem tablosunu alfabetik sırayla döndürür.

SELECT 
  name, recovery_model_desc
FROM sys.databases 
WHERE database_id < 5
ORDER BY name ASC;

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

name recovery_model_desc
master BASİT
model DOLU
msdb BASİT
tempdb BASİT

Her satırın önüne bir satır numarası sütunu eklemek için, bu durumda adı olan fonksiyonun Row#olduğu bir sütun ROW_NUMBER ekleyin. Maddeyi ORDER BY maddeye OVER taşımalısın.

SELECT 
  ROW_NUMBER() OVER(ORDER BY name ASC) AS Row#,
  name, recovery_model_desc
FROM sys.databases 
WHERE database_id < 5;

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

Sıra# name recovery_model_desc
1 master BASİT
2 model DOLU
3 msdb BASİT
4 tempdb BASİT

PARTITION BY Sütundaki recovery_model_desc madde, değer değiştiğinde recovery_model_desc numaralandırmayı yeniden başlatır.

SELECT 
  ROW_NUMBER() OVER(PARTITION BY recovery_model_desc ORDER BY name ASC) 
    AS Row#,
  name, recovery_model_desc
FROM sys.databases WHERE database_id < 5;

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

Sıra# name recovery_model_desc
1 model DOLU
1 master BASİT
2 msdb BASİT
3 tempdb BASİT

B. Satış temsilcileri için satır numarasını geri göndermek

Aşağıdaki örnek, Adventure Works Cycles'taki satış temsilcilerinin yılbaşından beri satış sıralamalarına göre satır numarası hesaplar.

USE AdventureWorks2022;   
GO  
SELECT ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS Row,   
    FirstName, LastName, ROUND(SalesYTD,2,1) AS "Sales YTD"   
FROM Sales.vSalesPerson  
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;  

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

  
Row FirstName    LastName               SalesYTD  
--- -----------  ---------------------- -----------------  
1   Linda        Mitchell               4251368.54  
2   Jae          Pak                    4116871.22  
3   Michael      Blythe                 3763178.17  
4   Jillian      Carson                 3189418.36  
5   Ranjit       Varkey Chudukatil      3121616.32  
6   José         Saraiva                2604540.71  
7   Shu          Ito                    2458535.61  
8   Tsvi         Reiter                 2315185.61  
9   Rachel       Valdez                 1827066.71  
10  Tete         Mensa-Annan            1576562.19  
11  David        Campbell               1573012.93  
12  Garrett      Vargas                 1453719.46  
13  Lynn         Tsoflias               1421810.92  
14  Pamela       Ansman-Wolfe           1352577.13  

C. Bir alt satır kümesi döndürülüyor

Aşağıdaki örnek, tablodaki SalesOrderHeader tüm satır sayılarını şu sırayla OrderDate hesaplar ve sadece satırları 50 dahil 60 eder.

USE AdventureWorks2022;  
GO  
WITH OrderedOrders AS  
(  
    SELECT SalesOrderID, OrderDate,  
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS RowNumber  
    FROM Sales.SalesOrderHeader   
)   
SELECT SalesOrderID, OrderDate, RowNumber    
FROM OrderedOrders   
WHERE RowNumber BETWEEN 50 AND 60;  

D. ROW_NUMBER() ile BÖLÜM kullanımı

Aşağıdaki örnek, sorgu sonuç kümesini TerritoryNamesütunla bölmek için argümanı PARTITION BY kullanır. Maddede OVER belirtilen madde, ORDER BY her bölümdeki satır sıralarını sütunla SalesYTDsıralar. Cümledeki SELECT cümleORDER BY, tüm sorgu sonuç kümesini 'ye göre TerritoryNamesıralar.

USE AdventureWorks2022;  
GO  
SELECT FirstName, LastName, TerritoryName, ROUND(SalesYTD,2,1) AS SalesYTD,  
ROW_NUMBER() OVER(PARTITION BY TerritoryName ORDER BY SalesYTD DESC) 
  AS Row  
FROM Sales.vSalesPerson  
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0  
ORDER BY TerritoryName;  

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

  
FirstName  LastName             TerritoryName        SalesYTD      Row  
---------  -------------------- ------------------   ------------  ---  
Lynn       Tsoflias             Australia            1421810.92    1  
José       Saraiva              Canada               2604540.71    1  
Garrett    Vargas               Canada               1453719.46    2  
Jillian    Carson               Central              3189418.36    1  
Ranjit     Varkey Chudukatil    France               3121616.32    1  
Rachel     Valdez               Germany              1827066.71    1  
Michael    Blythe               Northeast            3763178.17    1  
Tete       Mensa-Annan          Northwest            1576562.19    1  
David      Campbell             Northwest            1573012.93    2  
Pamela     Ansman-Wolfe         Northwest            1352577.13    3  
Tsvi       Reiter               Southeast            2315185.61    1  
Linda      Mitchell             Southwest            4251368.54    1  
Shu        Ito                  Southwest            2458535.61    2  
Jae        Pak                  United Kingdom       4116871.22    1  

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

E. Satış temsilcileri için satır numarasını geri göndermek

Aşağıdaki örnek, satış temsilcilerinin atanan satış kotasına göre geri döner ROW_NUMBER .

-- Uses AdventureWorks  
  
SELECT ROW_NUMBER() OVER(ORDER BY SUM(SalesAmountQuota) DESC) 
    AS RowNumber,  
    FirstName, LastName,   
    CONVERT(varchar(13), SUM(SalesAmountQuota),1) AS SalesQuota   
FROM dbo.DimEmployee AS e  
INNER JOIN dbo.FactSalesQuota AS sq  
    ON e.EmployeeKey = sq.EmployeeKey  
WHERE e.SalesPersonFlag = 1  
GROUP BY LastName, FirstName;  

Kısmi bir sonuç kümesi aşağıdadır.


RowNumber  FirstName  LastName            SalesQuota  
---------  ---------  ------------------  -------------  
1          Jillian    Carson              12,198,000.00  
2          Linda      Mitchell            11,786,000.00  
3          Michael    Blythe              11,162,000.00  
4          Jae        Pak                 10,514,000.00  

F. ROW_NUMBER() ile BÖLÜM kullanımı

Aşağıdaki örnek, fonksiyonun ROW_NUMBER argüman PARTITION BY ile birlikte kullanılmasını gösterir. Bu, fonksiyonun her bölümdeki satır numaralanmasına neden ROW_NUMBER olur.

-- Uses AdventureWorks  
  
SELECT ROW_NUMBER() OVER(PARTITION BY SalesTerritoryKey 
        ORDER BY SUM(SalesAmountQuota) DESC) AS RowNumber,  
    LastName, SalesTerritoryKey AS Territory,  
    CONVERT(varchar(13), SUM(SalesAmountQuota),1) AS SalesQuota   
FROM dbo.DimEmployee AS e  
INNER JOIN dbo.FactSalesQuota AS sq  
    ON e.EmployeeKey = sq.EmployeeKey  
WHERE e.SalesPersonFlag = 1  
GROUP BY LastName, FirstName, SalesTerritoryKey;  

Kısmi bir sonuç kümesi aşağıdadır.

 
RowNumber  LastName            Territory  SalesQuota  
---------  ------------------  ---------  -------------  
1          Campbell            1           4,025,000.00  
2          Ansman-Wolfe        1           3,551,000.00  
3          Mensa-Annan         1           2,275,000.00  
1          Blythe              2          11,162,000.00  
1          Carson              3          12,198,000.00  
1          Mitchell            4          11,786,000.00  
2          Ito                 4           7,804,000.00  

Ayrıca Bkz.

RÜTBE (Transact-SQL)
DENSE_RANK (Transact-SQL)
NTILE (Transact-SQL)