Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
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)