SQL Server 使用 CTE 高效删除重复数据
实现删除重复数据并保留一条记录
处理数据库中的重复记录,核心目标是在识别出重复项后,为每组保留唯一的一条数据。利用 SQL Server 的 CTE(公用表表达式)可以清晰、高效地完成这一任务,具体操作可分为三个步骤:
- 首先,使用
ROW_NUMBER()窗口函数作为“编号工具”。它的作用是为表中的每一行数据分配一个序号,关键点在于按照您指定的重复判定列(例如设备编号和发送日期)进行分组排序。 - 接着,通过
CTE创建一个临时的、可重用的结果集。这相当于建立了一个清晰的数据操作视图,便于后续处理。 - 最后,执行删除命令:仅保留每组中序号为1的原始记录,而将组内序号大于1的所有重复行安全移除。
WITH CTE AS ( SELECT IOT_TerminalNo, SendDate, EVoltage, ECurrent, CreateTime, ROW_NUMBER() OVER ( PARTITION BY IOT_TerminalNo, SendDate ORDER BY (SELECT 0) ) AS rn FROM Equipment_1001 where --IOT_TerminalNo='Weldjoin-000001' AND SendDate >='2025-04-01 00:00:00.000' AND SendDate<'2025-07-07 13:26:32.830' ) DELETE FROM CTE WHERE rn > 1;
PARTITION BY:此子句定义了数据分组的依据,即指定哪些字段组合用于判断数据是否重复。rn > 1:这个条件是执行数据清洗的筛选器,它会精准删除所有重复项,确保最终每组数据只留下第一条。
SQL Server 删除完全重复数据并保留一条
应用场景与前提
在数据库实际运维过程中,有时会遇到一种更特殊的情况:SQL Server 数据表中虽然定义了主键,但表中却存在多条所有字段值都完全一致的记录——包括主键字段本身。此时,若直接按主键执行删除操作,可能导致所有重复行被一并删除,造成数据丢失。因此,需要一种更安全的去重方法。
实现删除完全重复数据并保留一条
应对这种主键重复的复杂场景,上述基于 CTE 和窗口函数的方案依然是最佳实践。其操作流程保持一致:
- 利用
ROW_NUMBER()函数,为这些完全相同的“克隆”记录在组内进行编号。 - 通过
CTE构建一个临时的、结构化的数据视图,方便操作。 - 执行删除语句,安全移除组内编号大于1的所有冗余副本。
WITH CTE AS ( SELECT ## 字段 code, timePoint, ROW_NUMBER() OVER ( PARTITION BY code, TimePoint ORDER BY (SELECT 0) ) AS rn FROM table_name ) DELETE FROM CTE WHERE rn > 1;
关键步骤解析
PARTITION BY:这是精准定位重复组的关键。通过它来定义重复数据的判断标准,在本例中,即code和TimePoint两个字段值均相同的记录被视为一组。rn > 1:这是执行最终删除操作的判断条件。它确保了无论一组内存在多少条完全相同的记录,最终都只保留最先被编号的那一条,从而实现安全、无损的数据去重。
