适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics
Microsoft 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。
语法
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了 or AdventureWorksDW2025 示例数据库,你可以从 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