SQL Server删除仅日期或批次号不同的重复数据行方案咨询
SQL Server 重复行删除方案
可复用查询代码
你可以直接使用如下带ROW_NUMBER()的CTE语句实现需求,建议先执行注释中的SELECT语句验证待删除数据,确认无误后再执行DELETE操作:
WITH DuplicateGroup AS ( SELECT *, -- 按重复基准字段分组,组内按保留优先级排序 ROW_NUMBER() OVER( PARTITION BY ID_NUMBER, INCEPTION_DATE, OCCURRENCE ORDER BY FILE_LOAD_DATE ASC, BATCH_NUM ASC ) AS RowRank FROM mastertable WHERE SOURCE_SYSTEM = 'LEGACY' ) -- 第一步:先运行下面的SELECT校验待删除数据是否符合预期 -- SELECT * FROM DuplicateGroup WHERE RowRank > 1 -- 第二步:校验无误后注释SELECT,执行DELETE完成删除 DELETE FROM DuplicateGroup WHERE RowRank > 1
运行原理
- 分组逻辑:
PARTITION BY后配置的是你判定重复的基准字段,三个字段值完全相同的行会被划到同一个分组,和你原有查询的重复判定规则完全一致。 - 保留规则:
ORDER BY后配置的是组内行的优先级,先按FILE_LOAD_DATE升序排列,更早的加载日期优先级更高;如果加载日期相同,再按BATCH_NUM升序排列,更小的批次号优先级更高。组内优先级最高的行RowRank值为1,是需要保留的记录,其余RowRank>1的都是要删除的重复行。 - 执行逻辑:SQL Server支持对单表生成的CTE执行写操作,删除CTE中符合条件的行时,会直接同步删除底层
mastertable的对应数据,不需要额外关联原表,语法简洁高效。 - 复用说明:后续处理同类去重需求时,仅需要修改三处配置即可适配:
PARTITION BY后的重复判定字段、ORDER BY后的保留优先级规则、WHERE子句的筛选范围,不需要调整整体结构。
内容的提问来源于stack exchange,提问作者Nicholas Gregory
相关产品推荐
相关产品推荐

