Megosztás a következőn keresztül:


ROW_NUMBER (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példányAzure Synapse AnalyticsElemzési platformrendszer (PDW)SQL Analytics-végpont a Microsoft FabricbenRaktár a Microsoft FabricbenSQL-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 BY egyediek.

  • A partíciós oszlop és ORDER BY oszlopok é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)