SQL Server删除表集中重复数据实例

林舟
林舟
发布时间:2026-10-14| 5人浏览过
原创

在 SQL Server 数据库中,经常需要根据多个字段的组合条件来判断是否存在重复数据,并需要将其删除以维护数据完整性。本文将演示如何结合 ROW_NUMBER() 窗口函数与标准 DELETE 语句,精确识别并移除符合条件的重复行。

问题背景与结果目标

在实际业务场景中,“重复”往往由多个字段共同定义。例如:只要 companyName(公司名称)、invoiceNumber(发票号)和 customerNumber(客户号)三者都相同,即可判定为一条重复数据。

目标:保留每个“三字段组合”中的第一条记录,将剩余的重复项彻底删除,使数据集中不再存在重复组合。

准备条件与数据环境

我们将使用 SQL Server 的表变量作为测试数据集,创建一个名为 @InvoiceListMaster 的结构,包含自增主键 ID 以及上述三个核心字段和附加字段 rmaNumber。

第1步:构建包含重复数据的临时表结构

目的:初始化一个具有明确重复结构的测试环境。

  1. 定义表变量结构,指定 ID 为自增主键。
  2. 插入多组模拟数据,确保部分行的 companyName、invoiceNumber 和 CustomerNumber 完全一致。
declare @InvoiceListMaster table (
	ID int identity primary key,
	companyName Nchar(20),
	invoiceNumber int,
	CustomerNumber int,
	rmaNumber int 
)

-- 插入测试数据
insert  @InvoiceListMaster  
select N'华为', 1001,100,200  
union all  
select N'华为', 1001,100,300  
union all  
select N'华为', 1001,100,301  
union all  
select N'中兴', 1002, 200,1     
union all  
select N'中兴', 1002, 200,2  

-- 检查初始状态
select * from @InvoiceListMaster

执行后,前 3 条记录的 companyName 均为 '华为',且发票号和客制号相同,属于待处理的重复组;后 2 条同理属于另一组重复。

真实操作顺序:实现去重

第2步:利用窗口函数标记重复位置

目的:为每组重复数据打上唯一的序号标签,以便区分“保留者”与“删除者”。

使用 ROW_NUMBER() 函数,基于 companyname、invoicenumber 和 customerNumber 进行分区(Partition By),并按默认顺序生成递增序号(Rown)。

第3步:执行 DELETE 删除多余行

目的:只针对序号大于该组最小序号的行执行删除操作。

  1. 入口与逻辑: 对临时表进行一次内部查询,计算出每行在其重复组中的序列号。
  2. 动作: 使用 EXISTS 子句判断:如果某行的 rown 大于同组内其他行的 rown(即存在比它更靠前的记录),则该行即为重复数据。
  3. 参数: 关联条件为三字段值完全相等。
DELETE A 
from ( 
select rown = ROW_NUMBER( )over( partition by companyname, invoicenumber, customerNumber order by companyname, invoicenumber, customerNumber ), 
companyname, invoicenumber, customerNumber 
from @InvoiceListMaster )a 
where exists ( select 1   
from ( select rown = ROW_NUMBER( )over( partition by companyname, invoicenumber, customerNumber order by companyname, invoicenumber, customerNumber ), 
companyname, invoicenumber, customerNumber 
from @InvoiceListMaster ) b 
where b.companyName = a.companyName 
and b.invoiceNumber = a.invoiceNumber 
and b.CustomerNumber = a.CustomerNumber 
and a.rown > b.rown  
) 

注意:由于窗口函数的特性,在此处我们依赖子查询的结果进行过滤。此写法直接作用于内存表变量或视图化的查询结果。

第4步:验证最终结果

目的:确认重复数据已被安全清除,且每组保留了唯一的一条基准记录。

select * from @InvoiceListMaster

执行后,预期结果为:华为组仅保留 rmaNumber=200 的那一行(假设它是第一顺位被读取/写入的),其余重复项已消失。

完成判断与简要总结

完成判断:再次执行 SELECT COUNT(*) 对比行数变化,或观察同一组特征值的记录数是否降为 1。若所有组合的唯一性得到保证,即操作成功。

总结:本实例展示了在 SQL Server 环境下不依赖外部程序或游标,纯依靠 T-SQL 内置的 ROW_NUMBER() 窗口函数高效处理重复数据的方案。这种方法灵活且性能优异,适合大多数基于多字段判重的场景。

以上就是 SQL Server 数据库删除数据集中重复数据实例讲解的详细内容,更多关于 SQL Server 数据处理优化的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。