ROW_NUMBER (Transact-SQL)
2015-01-31 10:32
316 查看
ROW_NUMBER (Transact-SQL)
SQL Server 2014其他版本
返回结果集分区内行的序列号,每个分区的第一行从 1 开始。
适用范围:SQL Server(SQL Server 2008 至当前版本),Windows Azure SQL Database(初始版本至当前版本)。 |
Transact-SQL
语法约定
语法
ROW_NUMBER ( ) OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )
参数
PARTITION BY value_expression将 FROM 子句生成的结果集划分为应用 ROW_NUMBER 函数的分区。 value_expression 指定对结果集进行分区所依据的列。 如果未指定
PARTITION BY,则此函数将查询结果集的所有行视为单个组。 有关详细信息,请参阅 OVER 子句 (Transact-SQL)。
order_by_clause
ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。 它是必需的。 有关详细信息,请参阅 OVER
子句 (Transact-SQL)。
返回类型
bigint
一般备注
除非以下条件成立,否则不保证在每次执行时,使用 ROW_NUMBER() 的查询所返回行的顺序完全相同。分区列的值是唯一的。
ORDER BY 列的值是唯一的。
分区列和 ORDER BY 列的值的组合是唯一的。
ROW_NUMBER() 具有不确定性。 有关详细信息,请参阅确定性函数和不确定性函数。
示例
A.返回销售人员的行号
以下示例根据销售人员年初至今的销售额,计算 Adventure Works Cycles 中销售人员的行号。USE AdventureWorks2012; GO SELECT ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS Row, FirstName, LastName, ROUND(SalesYTD,2,1) AS "Sales YTD" FROM Sales.vSalesPerson WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;
下面是结果集:
Row FirstName LastName SalesYTD --- ----------- ---------------------- ----------------- 1 Linda Mitchell 4251368.54 2 Jae Pak 4116871.22 3 Michael Blythe 3763178.17 4 Jillian Carson 3189418.36 5 Ranjit Varkey Chudukatil 3121616.32 6 José Saraiva 2604540.71 7 Shu Ito 2458535.61 8 Tsvi Reiter 2315185.61 9 Rachel Valdez 1827066.71 10 Tete Mensa-Annan 1576562.19 11 David Campbell 1573012.93 12 Garrett Vargas 1453719.46 13 Lynn Tsoflias 1421810.92 14 Pamela Ansman-Wolfe 1352577.13
B.返回行的子集
下面的示例按 OrderDate 的顺序计算 SalesOrderHeader 表中所有行的行号,并只返回行 50 到 60(含)。USE AdventureWorks2012; GO WITH OrderedOrders AS ( SELECT SalesOrderID, OrderDate, ROW_NUMBER() OVER (ORDER BY OrderDate) AS RowNumber FROM Sales.SalesOrderHeader ) SELECT SalesOrderID, OrderDate, RowNumber FROM OrderedOrders WHERE RowNumber BETWEEN 50 AND 60;
C.将 ROW_NUMBER () 与 PARTITION 一起使用
以下示例使用 PARTITION BY 参数按列 TerritoryName 对结果集进行分区。 在 OVER 子句中指定的 ORDERBY 子句按列 SalesYTD 对每个分区中的行进行排序。 SELECT 语句中的ORDER
BY 按 TerritoryName 子句对整个查询结果集进行排序。
USE AdventureWorks2012; GO SELECT FirstName, LastName, TerritoryName, ROUND(SalesYTD,2,1), ROW_NUMBER() OVER(PARTITION BY TerritoryName ORDER BY SalesYTD DESC) AS Row FROM Sales.vSalesPerson WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0 ORDER BY TerritoryName;
下面是结果集:
FirstName LastName TerritoryName SalesYTD Row --------- -------------------- ------------------ ------------ --- Lynn Tsoflias Australia 1421810.92 1 José Saraiva Canada 2604540.71 1 Garrett Vargas Canada 1453719.46 2 Jillian Carson Central 3189418.36 1 Ranjit Varkey Chudukatil France 3121616.32 1 Rachel Valdez Germany 1827066.71 1 Michael Blythe Northeast 3763178.17 1 Tete Mensa-Annan Northwest 1576562.19 1 David Campbell Northwest 1573012.93 2 Pamela Ansman-Wolfe Northwest 1352577.13 3 Tsvi Reiter Southeast 2315185.61 1 Linda Mitchell Southwest 4251368.54 1 Shu Ito Southwest 2458535.61 2 Jae Pak United Kingdom 4116871.22 1
请参阅
参考
RANK (Transact-SQL)DENSE_RANK (Transact-SQL)
NTILE (Transact-SQL)
原文地址:https://msdn.microsoft.com/zh-cn/library/ms186734.aspx
相关文章推荐
- 排名函数:RANK、DENSE_RANK、NTILE、ROW_NUMBER值得一用 (Transact-SQL)
- ROW_NUMBER (Transact-SQL)
- 【ROW_NUMBER 函数(Transact-SQL)】
- ROW_NUMBER (Transact-SQL)
- sql server ROW_NUMBER (Transact-SQL) 分组查询
- Sql Server2005 Transact-SQL 排名函数 row_number() rank() dense_rank() ntile()
- ROW_NUMBER (Transact-SQL)(摘自MSDN)
- ROW_NUMBER (Transact-SQL)
- ROW_NUMBER (Transact-SQL)
- sql中用CTE实现增加row_number()列
- 详述 SQL 中的 distinct 和 row_number() over() 的区别及用法
- [Oracle]高效的SQL语句之分析函数(三)--row_number() /rank()/dense_rank()
- [Oracle]高效的SQL语句之分析函数(三)--row_number() /rank()/dense_rank()
- 数据库SQL中对查询结果排序排列序号编号,Oracle分析函数 rank,dense_rank,row_number使用和区别
- 精简SQL分页语句---ROW_NUMBER
- sql中row_number()over是什么意思
- SQL2005四个排名函数(row_number、rank、dense_rank和ntile)的比较
- SQL技术内幕-4 row_number() over( partition by XX order by XX)的用法(区别于group by 和order by)
- 常用SQL整理 - ROW_NUMBER()
- @@ROWCOUNT (Transact-SQL)