Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felügyelt Azure SQL-példány
Azure Synapse Analytics
Elemzési platformrendszer (PDW)
SQL Analytics-végpont a Microsoft Fabricben
Raktár a Microsoft Fabricben
SQL-adatbázis a Microsoft Fabricben
Számok az eredményhalmaz kimenete. Konkrétabban, egy sor sorozatszámát adja vissza egy eredményhalmazon belüli partíción belül, amely az első sornál 1-től indul minden részben.
ROW_NUMBER és RANK hasonlóak.
ROW_NUMBER az összes sort sorsorban számozzák (például 1, 2, 3, 4, 5).
RANK ugyanazt a számértéket adja a holtversenyekre (például 1, 2, 2, 4, 5).
Megjegyzés:
ROW_NUMBER egy ideiglenes érték, amelyet a lekérdezés futtatásakor számítanak ki. A számok megtartásához egy táblázatban lásd: IDENTITY Property és SEQUENCE.
Transact-SQL szintaxis konvenciók
Szemantika
ROW_NUMBER ( )
OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )
Arguments
FELOSZTÁS value_expression SZERINT
A FROM klauzula által generált eredményhalmazt osztja partíciókra, amelyekhez a ROW_NUMBER függvényt alkalmazzák.
value_expression megadja azt az oszlopot, amelybe az eredményhalmaz partíciózódik. Ha PARTITION BY nincs megadva, a függvény a lekérdezés eredményhalmazának összes sorát egyetlen csoportként kezeli. További információ: OVER záradék (Transact-SQL).
order_by_clause
A ORDER BY záradék határozza meg azt a sorrendet, amelyben a sorok egy meghatározott partíción belül egyedi módon kapják ROW_NUMBER a sorokat. Ez kötelező. További információ: OVER záradék (Transact-SQL).
Visszatérési típusok
bigint
Általános megjegyzések
Nincs garancia arra, hogy a lekérdezés által ROW_NUMBER() visszaadott sorok minden végrehajtásnál pontosan ugyanúgy sorolhatók lesznek, hacsak a következő feltételek nem érvényesek.
A partíciós oszlop értékei egyediek.
Az oszlopok értékei
ORDER BYegyediek.A partíciós oszlop és
ORDER BYoszlopok értékeinek kombinációi egyediek.
Ha az ORDER BY oszlopok nem egyediek az eredményekben, fontold meg az vagy DENSE_RANK()használatátRANK().
ROW_NUMBER() nemdeterminista. További információ: Determinisztikus és Nemdeterminista függvények.
Példák
A. Egyszerű példák
A következő lekérdezés ábécé sorrendben adja vissza a négy rendszertáblát.
SELECT
name, recovery_model_desc
FROM sys.databases
WHERE database_id < 5
ORDER BY name ASC;
Itt van az eredmények összessége.
| név | recovery_model_desc |
|---|---|
| master | EGYSZERŰ |
| modell | TELJES |
| msdb | EGYSZERŰ |
| tempdb | EGYSZERŰ |
Ha minden sor elé, egy sorszám-oszlopot adjunk hozzá egy oszlopot a ROW_NUMBER függvényrel, ebben az esetben a nevük Row#. Elő kell helyezned a ORDER BY záradékot a kizáradáshoz OVER .
SELECT
ROW_NUMBER() OVER(ORDER BY name ASC) AS Row#,
name, recovery_model_desc
FROM sys.databases
WHERE database_id < 5;
Itt van az eredmények összessége.
| Sor# | név | recovery_model_desc |
|---|---|---|
| 1 | master | EGYSZERŰ |
| 2 | modell | TELJES |
| 3 | msdb | EGYSZERŰ |
| 4 | tempdb | EGYSZERŰ |
Az oszlopon lévő PARTITION BY záradék recovery_model_desc újraindítja a számozást, amikor az recovery_model_desc érték változik.
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;
Itt van az eredmények összessége.
| Sor# | név | recovery_model_desc |
|---|---|---|
| 1 | modell | TELJES |
| 1 | master | EGYSZERŰ |
| 2 | msdb | EGYSZERŰ |
| 3 | tempdb | EGYSZERŰ |
B. A sorszám visszaküldése az értékesítőknek
Az alábbi példa az Adventure Works Cycles értékesítői sorszámát számolja ki az év eddigi értékesítési rangsoruk alapján.
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;
Itt van az eredmények összessége.
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. Sorok részhalmazának visszaküldése
A következő példa a táblázat összes sorának SalesOrderHeader számait számolja ki a sorrendben OrderDate , és csak 50 a sorokat adja vissza az inklíz kategóriába 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. ROW_NUMBER() használata a PARTITION-val
A következő példa az PARTITION BY argumentumot használja a lekérdezés eredményhalmazának az oszlopra TerritoryNametörténő felosztására. A ORDER BY klauzulában megadott klauzula OVER minden partícióban sorrendbe helyezi az oszlop SalesYTDszerinti sorokat. Az állításban szereplő klaulaud ORDER BYSELECT a teljes lekérdezési eredményhalmazt a - TerritoryNamere rendeli.
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;
Itt van az eredmények összessége.
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éldák: Azure Synapse Analytics and Analytics Platform System (PDW)
E. A sorszám visszaküldése az értékesítőknek
Az alábbi példa az értékesítési képviselők számára a hozzárendelt értékesítési kvótát alapján adja ROW_NUMBER vissza.
-- 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;
Íme egy részleges eredménykészlet.
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. ROW_NUMBER() használata a PARTITION-val
A következő példa a függvényt az PARTITION BY argumentummal együtt mutatja.ROW_NUMBER Ez miatt a ROW_NUMBER függvény számozza az egyes partíciók sorait.
-- 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;
Íme egy részleges eredménykészlet.
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
Lásd még:
RETT (Transact-SQL)
DENSE_RANK (Transact-SQL)
NTILE (Transact-SQL)