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


RETT (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

Visszaadja minden sor rangját az eredményhalmaz partícióján belül. A sorrend egy plusz a sorban lévő rangok száma.

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:

RANK 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 az IDENTITY (Property) és a CREATE SEQUENCE (SEQUENCE) menük.

Transact-SQL szintaxis konvenciók

Szemantika

RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )

Arguments

VÉGE ( [ partition_by_clause ] order_by_clause )

A partition_by_clause a klauzula által generált FROM eredményhalmazt osztja szétosztásokra, amelyekhez a függvény alkalmazzák. Ha nincs megadva, a függvény a lekérdezés eredményhalmazának összes sorát egyetlen csoportként kezeli.

A order_by_clause határozza meg az adatok sorrendjét a függvény alkalmazása előtt. A order_by_clause szükséges. A <rows or range clause>OVER klauzula nem lehet megadni a RANK függvényhez. További információ: SELECT – OVER záradék.

Visszatérési típusok

bigint

Megjegyzések

Ha két vagy több sor dönt egy rangban, minden kiegyenlített sor ugyanazt a rangot kapja. Például, ha a két legjobb értékesítő ugyanazt SalesYTD az értéket képviseli, mindkettő egy rangsorban van. A következő legmagasabb SalesYTD értékesítő a harmadik helyen áll, mert két sor van magasabb. Ezért a RANK függvény nem mindig vezet vissza egymást követő egész számokat.

Az egész lekérdezéshez használt rendezési sorrend határozza meg, hogy a sorok milyen sorrendben jelennek meg az eredményhalmazban.

RANK nemdeterminista. További információ: Determinisztikus és nem determinisztikus függvények.

Példák

A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.

A. Rangsorok egy partíción belül

Az alábbi példa a készletben lévő termékeket a megadott készlethelyeken a mennyiségük szerint rangsorolja. Az eredményhalmaz partícióval LocationID van osztva, és logikusan sorolva .Quantity A 3. helyszínen a 494 és 495 termékek ugyanannyi mennyiséget tartalmaznak. Mivel holtversenyben vannak, mindketten egy rangsorban vannak.

USE AdventureWorks2025;
GO

SELECT i.ProductID,
       p.Name,
       i.LocationID,
       i.Quantity,
       RANK() OVER (PARTITION BY i.LocationID ORDER BY i.Quantity DESC) AS Rank
FROM Production.ProductInventory AS i
     INNER JOIN Production.Product AS p
         ON i.ProductID = p.ProductID
WHERE i.LocationID BETWEEN 3 AND 4
ORDER BY i.LocationID;

Itt van az eredmények összessége.

ProductID   Name                   LocationID   Quantity Rank
----------- ---------------------- ------------ -------- ----
494         Paint - Silver         3            49       1
495         Paint - Blue           3            49       1
493         Paint - Red            3            41       3
496         Paint - Yellow         3            30       4
492         Paint - Black          3            17       5
495         Paint - Blue           4            35       1
496         Paint - Yellow         4            25       2
493         Paint - Red            4            24       3
492         Paint - Black          4            14       4
494         Paint - Silver         4            12       5

B. Rangsorolni az összes sort egy eredményhalmazban

Az alábbi példa a legjobb 10 alkalmazottat adja vissza, fizetésük szerint rangsorolva. Mivel egy PARTITION BY záradék nincs megadva, a RANK függvényt az eredményhalmaz minden sorára alkalmazzák.

USE AdventureWorks2025;
GO

SELECT TOP (10) BusinessEntityID,
                Rate,
                RANK() OVER (ORDER BY Rate DESC) AS RankBySalary
FROM HumanResources.EmployeePayHistory AS eph1
WHERE RateChangeDate = (
    SELECT MAX(RateChangeDate)
    FROM HumanResources.EmployeePayHistory AS eph2
    WHERE eph1.BusinessEntityID = eph2.BusinessEntityID
)
ORDER BY BusinessEntityID;

Itt van az eredmények összessége.

BusinessEntityID Rate                  RankBySalary
---------------- --------------------- --------------------
1                125.50                1
2                63.4615               4
3                43.2692               11
4                29.8462               28
5                32.6923               22
6                32.6923               22
7                50.4808               6
8                40.8654               14
9                40.8654               14
10               42.4808               13

Példák: Azure Synapse Analytics and Analytics Platform System (PDW)

C: Sorok rangsorolása egy partíción belül

Az alábbi példa az értékesítési területek értékesítési képviselőit az összes eladásuk alapján rangsorolja. A sorhalmazt partíciója és SalesTerritoryGroup rendezése .SalesAmountQuota

-- Uses AdventureWorks
SELECT e.LastName,
       st.SalesTerritoryGroup,
       SUM(sq.SalesAmountQuota) AS TotalSales,
       RANK() OVER (PARTITION BY st.SalesTerritoryGroup ORDER BY SUM(sq.SalesAmountQuota) DESC) AS RankResult
FROM dbo.DimEmployee AS e
     INNER JOIN dbo.FactSalesQuota AS sq
         ON e.EmployeeKey = sq.EmployeeKey
     INNER JOIN dbo.DimSalesTerritory AS st
         ON e.SalesTerritoryKey = st.SalesTerritoryKey
WHERE e.SalesPersonFlag = 1
      AND st.SalesTerritoryGroup <> N'NA'
GROUP BY e.LastName, st.SalesTerritoryGroup;

Itt van az eredmények összessége.

LastName           SalesTerritoryGroup  TotalSales   RankResult
------------------ -------------------- ------------ -----------
Pak                Europe               10514000.00  1
Varkey Chudukatil  Europe               5557000.00   2
Valdez             Europe               2287000.00   3
Carson             North America        12198000.00  1
Mitchell           North America        11786000.00  2
Blythe             North America        11162000.00  3
Reiter             North America        8541000.00   4
Ito                North America        7804000.00   5
Saraiva            North America        7098000.00   6
Vargas             North America        4365000.00   7
Campbell           North America        4025000.00   8
Ansman-Wolfe       North America        3551000.00   9
Mensa-Annan        North America        2753000.00   10
Tsoflias           Pacific              1687000.00   1