等级(Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics分析平台系统(PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库Microsoft Fabric 中的 SQL 数据库

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

ROW_NUMBERRANK 类似。 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 。 子句的OVER函数<rows or range clause>无法指定RANK。 有关详细信息,请参阅 SELECT - OVER 子句

返回类型

bigint

备注

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

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

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

示例

本文中的代码示例使用 AdventureWorks2025AdventureWorksDW2025 示例数据库,可以从 Microsoft SQL Server 示例和社区项目 主页下载该数据库。

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 和 Analytics Platform System (PDW)

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