Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL Analytics-eindpunt in Microsoft Fabric
Magazijn in Microsoft Fabric
SQL-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 BYkolommen 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)