Sdílet prostřednictvím


HODNOST (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Vrátí hodnost každého řádku v rámci rozdělení výsledné množiny. Pořadí řady je jedna plus počet pořadí, které předcházejí danému řádku.

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:

RANK je dočasná hodnota vypočítaná při spuštění dotazu. Pro zachování čísel v tabulce viz IDENTITA (Vlastnost) a VYTVOŘIT SEKVENCI.

Transact-SQL konvence syntaxe

Syntaxe

RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )

Arguments

KONEC ( [ partition_by_clause ] order_by_clause )

partition_by_clause rozděluje množinu výsledků vytvořenou klauzulí FROM na partce, na které je funkce aplikována. Pokud není zadáno, funkce zachází se všemi řádky sady výsledků dotazu jako s jednou skupinou.

order_by_clause určuje pořadí dat před použití funkce. Je potřeba order_by_clause. Klauzule <rows or range clause> z OVER nelze pro funkci RANK specifikovat. Další informace naleznete v tématu SELECT - OVER klauzule.

Návratové typy

bigint

Poznámky

Pokud se dvě nebo více řad shodují o jednu řadu, každá řada na stejné úrovni získá stejnou hodnotu. Například pokud mají dva nejlepší prodejci stejnou SalesYTD hodnotu, oba jsou na prvním místě. Prodejce s dalším nejvyšším SalesYTD hodnocením je na třetím místě, protože jsou tam dva řádky, které jsou hodnoceny výš. Proto RANK funkce ne vždy vrací po sobě jdoucí celá čísla.

Pořadí třídění používané pro celý dotaz určuje pořadí, v jakém se řádky objevují ve výsledné množině.

RANK je nedeterministické. Další informace naleznete v tématu Deterministické a nedeterministické funkce.

Examples

Ukázky kódu v tomto článku používají ukázkovou databázi AdventureWorks2025 nebo AdventureWorksDW2025, kterou si můžete stáhnout z domovské stránky Microsoft SQL Serveru pro ukázky a komunitní projekty .

A. Řádky pořadí v rámci rozkladu

Následující příklad řadí produkty ve skladech na určených místech podle jejich množství. Množina výsledků je rozdělena a LocationID logicky uspořádaná podle Quantity. V lokalitě 3 mají produkty 494 a 495 stejné množství. Protože jsou na stejné úrovni, jsou oba na prvním místě.

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;

Tady je soubor výsledků.

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. Řadit všechny řádky ve výsledné množině

Následující příklad vrací 10 nejlepších zaměstnanců seřazených podle jejich platu. Protože klauzule PARTITION BY není specifikována, funkce RANK se aplikuje na všechny řádky ve výsledné množině.

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;

Tady je soubor výsledků.

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říklady: Azure Synapse Analytics a Analytický platformový systém (PDW)

C: Řazení řádků v rámci oddílu

Následující příklad řadí obchodní zástupce v každé prodejní oblasti podle jejich celkového prodeje. Řádková sada je rozdělena a SalesTerritoryGroup seřazena podle 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;

Tady je soubor výsledků.

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