Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná instance Azure SQL
Azure Synapse Analytics
Analytics Platform System (PDW)
Koncový bod analýzy SQL v Microsoft Fabric
Sklad v Microsoft Fabric
Databáze SQL v Microsoft Fabric
Čísluje výstup výsledné množiny. Konkrétně vrací sekvenční číslo řádku v rámci rozkladu výsledné množiny, začínající na 1 pro první řádek v každé části.
ROW_NUMBER a RANK jsou podobné.
ROW_NUMBER čísluje všechny řádky postupně (například 1, 2, 3, 4, 5).
RANK poskytuje stejnou číselnou hodnotu pro remízy (například 1, 2, 2, 4, 5).
Poznámka:
ROW_NUMBER je dočasná hodnota vypočítaná při spuštění dotazu. Pro zachování čísel v tabulce viz IDENTITY Property a SEQUENCE.
Syntaxe
ROW_NUMBER ( )
OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )
Arguments
ROZDĚLENÍ PODLE value_expression
Rozdělí množinu výsledků vytvořenou klauzulí FROM na oddíly, na které je aplikována funkce ROW_NUMBER.
value_expression specifikuje sloupec, podle kterého je výsledná množina rozdělena. Pokud PARTITION BY není specifikováno, funkce považuje všechny řádky z množiny výsledků dotazu jako jednu skupinu. Pro více informací viz OVER Clause (Transact-SQL).
order_by_clause
Klauzule ORDER BY určuje pořadí, v jakém jsou řádky přiřazeny jako ROW_NUMBER jedinečné v rámci dané části. Je to povinné. Pro více informací viz OVER Clause (Transact-SQL).
Návratové typy
bigint
Obecné poznámky
Není zaručeno, že řádky vrácené dotazem pomocí ROW_NUMBER() budou seřazeny přesně stejně při každém vykonání, pokud nejsou splněny následující podmínky.
Hodnoty rozděleného sloupce jsou jedinečné.
Hodnoty sloupců
ORDER BYjsou jedinečné.Kombinace hodnot sloupce a
ORDER BYsloupců rozdělení jsou jedinečné.
Pokud sloupce ORDER BY nejsou ve výsledcích jedinečné, zvažte použití RANK() nebo DENSE_RANK().
ROW_NUMBER() je nedeterministické. Další informace naleznete v tématu Deterministické a nedeterministické funkce.
Examples
A. Jednoduché příklady
Následující dotaz vrací čtyři systémové tabulky v abecedním pořadí.
SELECT
name, recovery_model_desc
FROM sys.databases
WHERE database_id < 5
ORDER BY name ASC;
Tady je soubor výsledků.
| název | recovery_model_desc |
|---|---|
| master | JEDNODUCHÝ |
| model | ÚPLNÝ |
| msdb | JEDNODUCHÝ |
| tempdb | JEDNODUCHÝ |
Pro přidání sloupce s číslem řádku před každý řádek přidejte sloupec s funkcí, ROW_NUMBER v tomto případě Row#nazvanou . Musíte posunout klauzuli ORDER BY nahoru na klauzuli OVER .
SELECT
ROW_NUMBER() OVER(ORDER BY name ASC) AS Row#,
name, recovery_model_desc
FROM sys.databases
WHERE database_id < 5;
Tady je soubor výsledků.
| Veslovat# | název | recovery_model_desc |
|---|---|---|
| 1 | master | JEDNODUCHÝ |
| 2 | model | ÚPLNÝ |
| 3 | msdb | JEDNODUCHÝ |
| 4 | tempdb | JEDNODUCHÝ |
Klauzule PARTITION BY na sloupci recovery_model_desc znovu spouští číslování, když se změní hodnota recovery_model_desc .
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;
Tady je soubor výsledků.
| Veslovat# | název | recovery_model_desc |
|---|---|---|
| 1 | model | ÚPLNÝ |
| 1 | master | JEDNODUCHÝ |
| 2 | msdb | JEDNODUCHÝ |
| 3 | tempdb | JEDNODUCHÝ |
B. Vrácení čísla řádku pro obchodníky
Následující příklad vypočítává číslo řádku pro obchodníky v cyklech Adventure Works na základě jejich prodejního hodnocení od začátku roku.
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;
Tady je soubor výsledků.
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. Vrácení podmnožiny řádků
Následující příklad vypočítá čísla řádků pro všechny řádky v SalesOrderHeader tabulce v pořadí OrderDate a vrací pouze řádky 50 do intervalu 60 .
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. Použití ROW_NUMBER() s PARTITION
Následující příklad používá PARTITION BY argument k rozdělení výsledku dotazu množiny podle sloupce TerritoryName. Klauzule ORDER BY specifikovaná v klauzuli OVER řadí řádky v každé partition podle sloupce SalesYTD. Klauzule ORDER BY ve SELECT výroku řadí celý výsledek dotazu množinu podle .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;
Tady je soubor výsledků.
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
Příklady: Azure Synapse Analytics a Analytický platformový systém (PDW)
E. Vrácení čísla řádku pro obchodníky
Následující příklad vrací pro ROW_NUMBER obchodní zástupce na základě jejich přidělené prodejní kvóty.
-- 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;
Tady je částečná sada výsledků.
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. Použití ROW_NUMBER() s PARTITION
Následující příklad ukazuje použití ROW_NUMBER funkce s argumentem PARTITION BY . To způsobí, že ROW_NUMBER funkce očísluje řádky v každé části.
-- 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;
Tady je částečná sada výsledků.
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
Viz také
HODNOST (Transact-SQL)
DENSE_RANK (Transact-SQL)
NTILE (Transact-SQL)