等级(Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsMicrosoft Fabric中的SQL分析端点Microsoft Fabric中的仓库Microsoft Fabric中的SQL数据库

返回结果集的分区内每行的排名。 行的排名是相关行之前的排名数加一。

ROW_NUMBER 和 RANK 类似。 ROW_NUMBER 按顺序对所有行进行编号(例如 1、2、3、4、5)。 RANK 为关系提供相同的数值(例如 1、2、2、4、5)。

注意

RANK 是运行查询时计算出的临时值。 要在表中持久化数字,请参见 IDENTITY (性质) 和 CREATE SEQUENCE。

Transact-SQL 语法约定

语法

RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )

参数

完毕([ partition_by_clause ] order_by_clause )

partition_by_clause将子句产生的FROM结果集划分为应用该函数的划分。 如果未指定,则此函数将查询结果集的所有行视为单个组。

order_by_clause 在应用函数之前确定数据的顺序。 需要 order_by_clause 。 子句的<rows or range clause>函数OVER无法指定RANK。 有关详细信息,请参阅 SELECT - OVER 子句。

返回类型

bigint

备注

如果两个或多个行与一个排名关联,则每个关联行将得到相同的排名。 例如,如果两位顶级销售人员的价值相同 SalesYTD ,他们都会被排为一。 排名第二 SalesYTD 的销售员排第三,因为有两行排排在更高。 因此,函数 RANK 并不总是返回连续的整数。

用于整个查询的排序顺序决定了行在结果集中的显示顺序。

RANK 具有不确定性。 有关详细信息,请参阅确定性函数和不确定性函数。

关于窗口函数性能调优的指导,请参见 OVER() 性能考虑。

示例

本文中的代码示例使用AdventureWorks2025了 、 AdventureWorksDW2025或AdventureWorksLT2025示例数据库,您可以从 Azure Data SQL Samples Repository 的 GitHub 仓库下载。

A. 分区内的秩行

以下示例按照数量对指定清单位置的清单中的产品进行了排名。 结果集按 LocationID 分区并在逻辑上按 Quantity 排序。 在位置3,产品494和495的数量相同。 因为他们并列,所以都排在第一。

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;

结果集如下。

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. 对结果集中的所有行进行排名

以下示例返回按薪资排名前10名的员工。 由于未指定子 PARTITION BY 句, RANK 函数会应用到结果集中的所有行。

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;

结果集如下。

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

示例:Azure Synapse Analytics

C:对分区中的行进行排名

下面的示例根据销售代表的销售总额将每个销售区域中的销售代表进行排名。 行集按 SalesTerritoryGroup 分区,按 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;

结果集如下。

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