Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analysplattformssystem (PDW)
SQL-analysslutpunkt i Microsoft Fabric
Lager i Microsoft Fabric
SQL-databas i Microsoft Fabric
Numrerar utdata från en resultatuppsättning. Mer specifikt returnerar den sekventiella numret för en rad inom en partition av en resultatmängd, med start på 1 för den första raden i varje partition.
ROW_NUMBER och RANK är liknande.
ROW_NUMBER numren är alla rader i följd (till exempel 1, 2, 3, 4, 5).
RANK ger samma numeriska värde för oavgjort (till exempel 1, 2, 2, 4, 5).
Anmärkning
ROW_NUMBER är ett temporärt värde som beräknas när frågan körs. För att behålla tal i en tabell, se IDENTITY Property och SEQUENCE.
Transact-SQL syntaxkonventioner
Syntax
ROW_NUMBER ( )
OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )
Arguments
PARTITION MED value_expression
delar in resultatmängden som produceras av FROM-satsen i partitioner där ROW_NUMBER funktionen tillämpas.
value_expression specificerar kolumnen som resultatmängden är uppdelad med. Om PARTITION BY inte anges behandlar funktionen alla rader i frågeresultatmängden som en enda grupp. Mer information finns i OVER-satsen (Transact-SQL).
order_by_clause
Klausulen ORDER BY bestämmer i vilken ordning raderna tilldelas sin unika ROW_NUMBER inom en specificerad partition. Det krävs. Mer information finns i OVER-satsen (Transact-SQL).
Returtyper
bigint
Allmänna kommentarer
Det finns ingen garanti för att raderna som returneras av en fråga med ROW_NUMBER() kommer att ordnas exakt likadant vid varje exekvering, om inte följande villkor är uppfyllda.
Värdena i den uppdelade kolumnen är unika.
Kolumnernas
ORDER BYvärden är unika.Kombinationer av värden för partitionskolumnen och
ORDER BYkolumnerna är unika.
Om kolumnerna ORDER BY inte är unika i resultaten, överväg att använda RANK() eller DENSE_RANK().
ROW_NUMBER() är nondeterministisk. Mer information finns i Deterministiska och nondeterministiska funktioner.
Examples
A. Enkla exempel
Följande fråga returnerar de fyra systemtabellerna i alfabetisk ordning.
SELECT
name, recovery_model_desc
FROM sys.databases
WHERE database_id < 5
ORDER BY name ASC;
Här är resultatet.
| name | recovery_model_desc |
|---|---|
| master | ENKEL |
| model | FULLT |
| msdb | ENKEL |
| tempdb | ENKEL |
För att lägga till en kolumn med radnummer framför varje rad, lägg till en kolumn med ROW_NUMBER funktionen, i detta fall kallad Row#. Du måste flytta klausulen ORDER BY upp till klausulen OVER .
SELECT
ROW_NUMBER() OVER(ORDER BY name ASC) AS Row#,
name, recovery_model_desc
FROM sys.databases
WHERE database_id < 5;
Här är resultatet.
| Rad# | name | recovery_model_desc |
|---|---|---|
| 1 | master | ENKEL |
| 2 | model | FULLT |
| 3 | msdb | ENKEL |
| 4 | tempdb | ENKEL |
Klausulen PARTITION BY i recovery_model_desc kolumnen startar numreringen om när recovery_model_desc värdet ändras.
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;
Här är resultatet.
| Rad# | name | recovery_model_desc |
|---|---|---|
| 1 | model | FULLT |
| 1 | master | ENKEL |
| 2 | msdb | ENKEL |
| 3 | tempdb | ENKEL |
B. Returnera radnumret för försäljare
Följande exempel beräknar ett radnummer för säljarna i Adventure Works Cycles baserat på deras försäljningsranking hittills i år.
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;
Här är resultatet.
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. Returnera en delmängd av rader
Följande exempel beräknar radnummer för alla rader i SalesOrderHeader tabellen i ordningen och OrderDate returnerar endast rader 50 till 60 inklusive.
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. Att använda ROW_NUMBER() med PARTITION
Följande exempel använder argumentet PARTITION BY för att dela upp frågeresultatet som satts med kolumnen TerritoryName. Den ORDER BY klausul som anges i OVER klausulen ordnar raderna i varje partition efter kolumnen SalesYTD. Klausulen ORDER BY i satsen SELECT ordnar hela frågeresultatet satt med 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;
Här är resultatet.
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
Exempel: Azure Synapse Analytics and Analytics Platform System (PDW)
E. Returnera radnumret för försäljare
Följande exempel returnerar ROW_NUMBER för säljare baserat på deras tilldelade försäljningskvot.
-- 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;
Här är en partiell resultatmängd.
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. Att använda ROW_NUMBER() med PARTITION
Följande exempel visar att funktionen används ROW_NUMBER med argumentet PARTITION BY . Detta gör ROW_NUMBER att funktionen numrerar raderna i varje partition.
-- 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;
Här är en partiell resultatmängd.
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
Se även
RANG (Transact-SQL)
DENSE_RANK (Transact-SQL)
NTILE (Transact-SQL)