ROW_NUMBER()用法(转)

本文深入解析SQL中的ROW_NUMBER()函数用法,包括其语法、参数、返回类型及其在实际场景中的应用示例。通过具体实例展示了如何使用ROW_NUMBER()函数为分区内行分配序列号,以及如何结合ORDER BY子句调整行的排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

ROW_NUMBER()用法(转)

  ROW_NUMBER()

说明:返回结果集分区内行的序列号,每个分区的第一行从 1 开始。
语法:ROW_NUMBER () OVER ( [ <partition_by_clause> ] <order_by_clause> ) 。
备注:ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。
参数:<partition_by_clause> :将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。  
      <order_by_clause>:确定将 ROW_NUMBER 值分配给分区中的行的顺序。
返回类型:bigint


示例:
/*以下示例将根据年初至今的销售额,返回 AdventureWorks 中销售人员的 ROW_NUMBER。*/
USE AdventureWorks
GO
SELECT c.FirstName, c.LastName, ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number', s.SalesYTD, a.PostalCode       
FROM Sales.SalesPerson s JOIN Person.Contact c on s.SalesPersonID = c.ContactID     
JOIN Person.Address a ON a.AddressID = c.ContactID    
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0   
/*
FirstName  LastName    Row Number  SalesYTD      PostalCode
---------  ----------  ----------  ------------  ----------------------------
Shelley    Dyck        1           5200475.2313  98027
Gail       Erickson    2           5015682.3752  98055
Maciej     Dusza       3           4557045.0459  98027
Linda      Ecoffey     4           3857163.6332  98027
Mark       Erickson    5           3827950.238   98055
Terry      Eminhizer   6           3587378.4257  98055
Michael    Emanuel     7           3189356.2465  98055
Jauna      Elson       8           3018725.4858  98055
Carol      Elliott     9           2811012.7151  98027
Janeth     Esteves     10          2241204.0424  98055
Martha     Espinoza    11          1931620.1835  98055
Carla      Eldridge    12          1764938.9859  98027
Twanna     Evans       13          1758385.926   98055
(13 行受影响)
*/
 
/*以下示例将返回行号为 50 到 60(含)的行,并以 OrderDate 排序。*/  
USE AdventureWorks; 
GO 
WITH OrderedOrders AS 
(SELECT SalesOrderID, OrderDate, 
ROW_NUMBER() OVER (order by OrderDate)as RowNumber 
FROM Sales.SalesOrderHeader )  
SELECT *  
FROM OrderedOrders  
WHERE RowNumber between 50 and 60; 
/*
SalesOrderID OrderDate               RowNumber 
------------ ----------------------- --------------------
43708        2001-07-03 00:00:00.000 50
43709        2001-07-03 00:00:00.000 51
43710        2001-07-03 00:00:00.000 52
43711        2001-07-04 00:00:00.000 53
43712        2001-07-04 00:00:00.000 54
43713        2001-07-05 00:00:00.000 55
43714        2001-07-05 00:00:00.000 56
43715        2001-07-05 00:00:00.000 57
43716        2001-07-05 00:00:00.000 58
43717        2001-07-05 00:00:00.000 59
43718        2001-07-06 00:00:00.000 60
(11 行受影响)
*/
ROW_NUMBER() 是 SQL 中的一个函数,它为查询结果中的每一行分配一个唯一的数字。这个数字是基于查询结果的顺序,从 1 开始递增。ROW_NUMBER() 函数通常与 OVER 子句一起使用,以在特定的分组或窗口范围内分配行号。 ROW_NUMBER() 函数的语法通常如下: ```scss ROW_NUMBER() OVER (PARTITION BY column1, column2, ... ORDER BY column3) AS alias ``` * `PARTITION BY`:可选参数,用于指定按哪个列或组对数据进行分区。这有助于在同一分区内的行之间分配行号。 * `ORDER BY`:可选参数,用于指定根据哪个列对分区内的行进行排序。如果没有指定排序列,则默认按照升序排序。 * `AS`:用于给结果集中的每一行分配一个别名。 ROW_NUMBER()用法示例: 假设有一个名为 Employees 的表,其中包含员工信息,包括员工编号(EmployeeID)和姓名(Name)。我们想要按部门(DepartmentID)对员工进行分组,并为每个员工分配一个行号。可以使用以下查询语句: ```sql SELECT ROW_NUMBER() OVER (PARTITION BY DepartmentID ORDER BY EmployeeID) AS RowNum, EmployeeID, Name FROM Employees; ``` 这将返回一个结果集,其中每一行都包含员工的行号(RowNum)、员工编号(EmployeeID)和姓名(Name)。行号是基于员工编号的顺序分配的,同一部门的员工将分配连续的行号。 通过使用 ROW_NUMBER() 函数,可以根据特定的分组和排序规则为查询结果中的每一行分配唯一的行号,这在一些情况下非常有用,例如用于分桶、计数或其他分析操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值