Delen via


ROW_NUMBER (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-eindpunt in Microsoft FabricMagazijn in Microsoft FabricSQL-database in Microsoft Fabric

Nummert de output van een resultaatset. Meer specifiek geeft het sequentiële nummer van een rij binnen een partitie van een resultaatset terug, beginnend bij 1 voor de eerste rij in elke partitie.

ROW_NUMBER en RANK zijn vergelijkbaar. ROW_NUMBER Alle rijen worden achtereenvolgens geteld (bijvoorbeeld 1, 2, 3, 4, 5). RANK geeft dezelfde numerieke waarde voor gelijken (bijvoorbeeld 1, 2, 2, 4, 5).

Opmerking

ROW_NUMBER is een tijdelijke waarde die wordt berekend wanneer de query wordt uitgevoerd. Om getallen in een tabel te behouden, zie IDENTITY Property en SEQUENCE.

Transact-SQL syntaxis-conventies

Syntaxis

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

Arguments

PARTITION PER value_expression
verdeelt de resultaatset die door de FROM-clausule wordt geproduceerd in partities waarop de ROW_NUMBER functie wordt toegepast. value_expression specificeert de kolom waarmee de resultaatverzameling wordt opgedeeld. Als PARTITION BY niet is gespecificeerd, behandelt de functie alle rijen van de zoekresultatenset als één enkele groep. Zie OVER-component (Transact-SQL) voor meer informatie.

order_by_clause
De ORDER BY clausule bepaalt de volgorde waarin de rijen hun unieke ROW_NUMBER worden toegewezen binnen een gespecificeerde partitie. Het is vereist. Zie OVER-component (Transact-SQL) voor meer informatie.

Retourtypen

bigint

Algemene opmerkingen

Er is geen garantie dat de rijen die door een query worden teruggegeven met exact ROW_NUMBER() hetzelfde worden geordend bij elke uitvoering, tenzij de volgende voorwaarden waar zijn.

  • De waarden van de gepartitioneerde kolom zijn uniek.

  • De waarden van de ORDER BY kolommen zijn uniek.

  • Combinatie van waarden van de partitiekolom en ORDER BY -kolommen is uniek.

Als de ORDER BY kolommen niet uniek zijn binnen de resultaten, overweeg dan of DENSE_RANK()te gebruikenRANK().

ROW_NUMBER() is niet-deterministisch. Zie Deterministische en niet-deterministische functies voor meer informatie.

Voorbeelden

Eén. Eenvoudige voorbeelden

De volgende query geeft de vier systeemtabellen in alfabetische volgorde terug.

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

Hier is het resultatenoverzicht.

naam recovery_model_desc
master EENVOUDIG
model VOLLEDIG
msdb EENVOUDIG
tempdb EENVOUDIG

Om een kolom met rijnummer voor elke rij toe te voegen, voeg je een kolom toe met de ROW_NUMBER functie, in dit geval genaamd Row#. Je moet de ORDER BY clausule naar de clausule OVER verplaatsen.

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

Hier is het resultatenoverzicht.

Roeien# naam recovery_model_desc
1 master EENVOUDIG
2 model VOLLEDIG
3 msdb EENVOUDIG
4 tempdb EENVOUDIG

De PARTITION BY clausule op de recovery_model_desc kolom start de nummering opnieuw wanneer de recovery_model_desc waarde verandert.

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;

Hier is het resultatenoverzicht.

Roeien# naam recovery_model_desc
1 model VOLLEDIG
1 master EENVOUDIG
2 msdb EENVOUDIG
3 tempdb EENVOUDIG

B. Het rijnummer teruggeven voor verkopers

Het volgende voorbeeld berekent een rijnummer voor de verkopers in Adventure Works Cycles op basis van hun verkooprangschikking tot nu toe van het jaar.

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;  

Hier is het resultatenoverzicht.

  
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. Het teruggeven van een deelverzameling van rijen

Het volgende voorbeeld berekent rijnummers voor alle rijen in de SalesOrderHeader tabel in de volgorde van de OrderDate en geeft alleen rijen 50 terug naar 60 inclusief.

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. Gebruik van ROW_NUMBER() met PARTITION

Het volgende voorbeeld gebruikt het PARTITION BY argument om het zoekresultaat te partitioneren dat is gezet door de kolom TerritoryName. De ORDER BY clausule die in de OVER clausule is gespecificeerd, ordent de rijen in elke partitie per kolom SalesYTD. De ORDER BY clausule in de SELECT instructie ordent het gehele zoekresultaat dat wordt gezet door TerritoryName.

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;  

Hier is het resultatenoverzicht.

  
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  

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

E. Het rijnummer teruggeven voor verkopers

Het volgende voorbeeld geeft de ROW_NUMBER voor verkoopvertegenwoordigers terug op basis van hun toegewezen verkoopquotum.

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

Hier volgt een gedeeltelijke resultatenset.


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. Gebruik van ROW_NUMBER() met PARTITION

Het volgende voorbeeld toont het gebruik van de ROW_NUMBER functie met het PARTITION BY argument. Dit zorgt ervoor dat de ROW_NUMBER functie de rijen in elke partitie nummert.

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

Hier volgt een gedeeltelijke resultatenset.

 
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  

Zie ook

RANG (Transact-SQL)
DENSE_RANK (Transact-SQL)
NTILE (Transact-SQL)