SQL Server利用ROW_NUMBER()给行编号,类似Oracle的rowID

本文详细介绍了SQLServer中ROW_NUMBER()函数的用法及语法结构。ROW_NUMBER()可以为查询结果中的每一行分配唯一的编号,支持按分区排序。文中通过实例展示了如何使用ROW_NUMBER()进行行号生成、分组编号等操作。

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

SQL Server中的ROW_NUMBER()的用法

ROW_NUMBER()函数针对select语句返回的每一行,从1开始编号,赋予其连续的编号。
ROW_NUMBER()语法
说明:返回结果集分区内行的序列号,每个分区的第一行从1开始。
语法:ROW_NUMBER() OVER ([ partition_by_clause ] order_by_clause)。
备注
partition_by_clause:将FROM子句生成的结果集划入应用了ROW_NUMBER()函数的分区。
order_by_clause:确定将ROW_NUMBER值分配给分区中的行的顺序。(排序)。
返回类型:bigint

ROW_NUMBER()常用的几种情况

1.产生行号

select ROW_NUMBER() over(order by azi01) rowID,* from  ERP_Currency

2.分组,然后进行编号

select ROW_NUMBER() over(partition by customerID  order by totalPrice) as rows,customerID,totalPrice, DID from OP_Order

3.若不想对查询结果进行排序,考虑使用order by(select 0)

select ROW_NUMBER() over(order by (select 0)) rowID,* from ERP_Currency 
### Oracle中 `ROW_NUMBER()` 的使用方法 `ROW_NUMBER()` 是一种窗口函数,在 Oracle 数据库中广泛应用于数据分析、分页查询以及数据去重等问题。其基本语法如下: ```sql ROW_NUMBER() OVER ([PARTITION BY column_list] ORDER BY column_list [ASC|DESC]) ``` #### 参数解释 - **PARTITION BY**: 可选参数,用于将结果集划分为多个分区(类似于按某个字段进行分组)。对于每个分区,`ROW_NUMBER()` 将独立编号。 - **ORDER BY**: 必需参数,定义每行的排序规则。通过该规则决定行号分配。 --- #### 示例:基于部门划分并排序 假设有一个名为 `employees` 的表,结构如下: - `employee_id`: 员工ID - `department_id`: 部门ID - `salary`: 薪资 目标是从每个部门选出薪资最高的员工。 ##### SQL 实现 ```sql SELECT * FROM ( SELECT employee_id, department_id, salary, ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rn FROM employees ) WHERE rn = 1; ``` 在此示例中: - `PARTITION BY department_id` 表示按照部门 ID 对数据进行分组[^4]。 - `ORDER BY salary DESC` 定义了在每个部门内部按薪资降序排列[^3]。 - 外层查询过滤掉除了每个部门最高薪者之外的所有记录。 --- #### 示例:去除重复数据 假设有以下场景:需要删除表中的重复记录,仅保留一条唯一的数据。 ##### SQL 实现 ```sql DELETE FROM employees WHERE rowid NOT IN ( SELECT MIN(rowid) FROM employees GROUP BY department_id, employee_name, salary ); ``` 或者利用 `ROW_NUMBER()` 来实现相同效果: ```sql WITH numbered_rows AS ( SELECT employee_id, department_id, salary, ROW_NUMBER() OVER (PARTITION BY department_id, employee_name, salary ORDER BY employee_id) AS rn FROM employees ) DELETE FROM employees WHERE employee_id IN ( SELECT employee_id FROM numbered_rows WHERE rn > 1 ); ``` 此脚本中: - `PARTITION BY department_id, employee_name, salary` 按照多列组合来识别重复项。 - 删除所有标记为重复的行(即 `rn > 1`)。 --- #### 示例:分页查询 假如要从 `employees` 表中提取第 20 到第 30 条记录。 ##### SQL 实现 ```sql SELECT * FROM ( SELECT employee_id, department_id, salary, ROW_NUMBER() OVER (ORDER BY employee_id) AS rn FROM employees ) WHERE rn BETWEEN 20 AND 30; ``` 这里: - `ROW_NUMBER() OVER (ORDER BY employee_id)` 给每一行分配了一个全局唯一的行号[^2]。 - 过滤条件 `BETWEEN 20 AND 30` 提取特定范围内的记录。 --- ### 总结 `ROW_NUMBER()` 结合 `PARTITION BY` 和 `ORDER BY` 子句能够灵活应对多种复杂业务需求,例如排名统计、数据清洗和高效分页等操作。上述例子展示了如何根据不同场景合理运用这一功能强大的工具。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值