ROW_NUMBER ( )

本文详细介绍了ROW_NUMBER()函数的使用方法,包括语法结构、参数解释及返回类型,并通过四个具体示例展示了如何使用该函数为结果集中的行分配唯一序列号,包括返回销售人员的行号、返回指定行的子集以及与PARTITION BY子句结合使用的方法。

ROW_NUMBER ( )
返回结果集分区内行的序列号,每个分区的第一行从 1 开始。

 

语法

ROW_NUMBER ( )     OVER ( [ <partition_by_clause> ] <order_by_clause> )

 

参数

<partition_by_clause>
将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。若要了解 PARTITION BY 语法,请参阅 OVER 子句 (Transact-SQL)。

<order_by_clause>
确定将 ROW_NUMBER 值分配给分区中的行的顺序。有关详细信息,请参阅 ORDER BY 子句 (Transact-SQL)。当在排名函数中使用 <order_by_clause> 时,不能用整数表示列。

 

返回类型
bigint
 
注释
ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。

 

示例

A. 返回销售人员的行号

以下示例将根据年初至今的销售额,返回 AdventureWorks2008R2 中销售人员的 ROW_NUMBER。

 

SELECT FirstName, LastName, ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number', SalesYTD, PostalCode

FROM Sales.vSalesPerson

WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;

 

B. 返回行的子集

以下示例将返回行号为 50 到 60 的行(包含这两行),并按 OrderDate 进行排序。

 

USE AdventureWorks2008R2;
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;

 

C. 将 ROW_NUMBER () 与 PARTITION 一起使用

以下示例显示了将 ROW_NUMBER 函数与 PARTITION BY 参数结合使用的情况。

 

SELECT FirstName, LastName, ROW_NUMBER() OVER(PARTITION BY PostalCode ORDER BY SalesYTD DESC) AS 'Row Number', SalesYTD, PostalCode
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;

 

D. 我的工作实例


with processhis as
(select c.serialno,
        c.serviceclassid,
        c.handlenotes
  from    
        (select p.serialno,
             p.serviceclassid,
             p.handlenotes,
             row_number() over(partition by p.serialno, p.serviceclassid order by p.dealid desc) rn
        from t_wf_processhis p
       where p.accepttime > sysdate - 7) c 
 where c.rn = 1)
 
select t.serialno, t.serviceclassid, t.servicecontent, s.handlenotes
  from processhis s, t_wf_serviceinfohis t
 where t.serialno = s.serialno
   and t.accepttime > sysdate - 7;

### ROW_NUMBER 使用方法及错误解决 ROW_NUMBER 是 SQL 中的一种窗口函数,用于为查询结果集中的每一行分配一个唯一的连续序号。以下是关于其使用方法和常见问题的详细说明。 #### 1. ROW_NUMBER 的基本语法 ROW_NUMBER 函数的基本语法如下: ```sql ROW_NUMBER() OVER ([PARTITION BY column_list] ORDER BY column_list) ``` - `PARTITION BY`:将结果集划分为多个分区,并在每个分区内独立编号。 - `ORDER BY`:指定排序规则,确保编号顺序与指定列的值一致[^3]。 #### 2. 示例代码 以下是一个使用 ROW_NUMBER 的示例,展示如何为员工表中的每条记录分配唯一序号: ```sql SELECT empno, WORKDEPT, SALARY, ROW_NUMBER() OVER (ORDER BY salary DESC) AS rank FROM employee; ``` 此查询将按薪资降序排列,并为每条记录分配一个从 1 开始的唯一序号[^2]。 #### 3. 在低版本 MySQL 中实现 ROW_NUMBER 对于不支持窗口函数的 MySQL 版本(如 5.6),可以通过变量赋值的方式模拟 ROW_NUMBER 功能。例如: ```sql SELECT a.u_name, a.class, a.score, IF(@class = a.class, @rownum := @rownum + 1, @rownum := 1) AS rn, @class := a.class FROM ( SELECT '张三' AS u_name, 59 AS score, '一班' AS class UNION ALL SELECT '李四' AS u_name, 15 AS score, '一班' AS class UNION ALL SELECT '王二' AS u_name, 88 AS score, '一班' AS class UNION ALL SELECT '王三' AS u_name, 88 AS score, '一班' AS class UNION ALL SELECT '刘六' AS u_name, 35 AS score, '二班' AS class UNION ALL SELECT '赵六' AS u_name, 100 AS score, '二班' AS class UNION ALL SELECT '王五' AS u_name, 48 AS score, '二班' AS class ) a, (SELECT @rownum := 0, @class := NULL) b ORDER BY a.class, a.score DESC; ``` 上述代码通过变量 `@rownum` 和 `@class` 实现了类似 ROW_NUMBER 的功能,适用于低版本 MySQL 环境[^4]。 #### 4. 常见错误及解决方法 - **错误 1**:在不支持窗口函数的数据库中直接使用 ROW_NUMBER。 - 解决方法:使用变量赋值或子查询替代窗口函数[^4]。 - **错误 2**:未正确指定 `ORDER BY` 子句。 - 解决方法:确保 `ORDER BY` 子句的存在,否则编号顺序可能不可预测[^3]。 - **错误 3**:在多分区场景下未使用 `PARTITION BY`。 - 解决方法:根据业务需求添加 `PARTITION BY` 子句,以确保每个分区内独立编号[^3]。 #### 5. 注意事项 - ROW_NUMBER 不会处理重复值,即使排序字段值相同,也会严格按行顺序递增编号[^3]。 - 如果需要处理并列情况,可以考虑使用 RANK 或 DENSE_RANK 函数[^3]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值