基于多列与IsActive条件删除数据表重复记录
针对你遇到的重复记录去重需求,我整理了一套符合规则的解决方案,咱们一步步来看:
需求明确
先把你提供的重复数据整理成清晰的表格:
| ID | OrgName | TaxID | IsActive | 备注 |
|---|---|---|---|---|
| 1 | Miller | 111 | 1 | 原始记录 |
| 1 | Miller | 111 | 1 | 重复项 |
| 1 | Miller | 111 | 0 | 重复项 |
| 1 | Miller | 111 | 0 | 重复项 |
| 2 | XYZ | 222 | 0 | 原始记录 |
| 2 | XYZ | 222 | 0 | 重复项 |
核心规则:
- 对ID、OrgName、TaxID完全相同的重复组,优先保留
IsActive=1的记录,删除同组内其他所有重复项 - 若组内无
IsActive=1的记录,暂不处理(待后续需求补充后再调整)
解决方案(以SQL为例)
假设你的数据表名为your_table,可以根据数据库版本选择以下两种方法:
方法1:窗口函数实现(推荐,适配MySQL 8.0+、PostgreSQL、SQL Server等现代数据库)
WITH ranked_records AS ( SELECT ID, OrgName, TaxID, IsActive, -- 给每组记录排序:IsActive=1的排第1位,其余按ID排序(可根据需求调整) ROW_NUMBER() OVER ( PARTITION BY ID, OrgName, TaxID ORDER BY IsActive DESC, ID ) AS row_num FROM your_table ) DELETE FROM your_table WHERE (ID, OrgName, TaxID, IsActive) IN ( SELECT ID, OrgName, TaxID, IsActive FROM ranked_records WHERE row_num > 1 );
代码说明
PARTITION BY ID, OrgName, TaxID:把数据按这三个字段分组,确保同一组是完全重复的记录ORDER BY IsActive DESC:强制让IsActive=1的记录排在同组最前面(1的优先级高于0)row_num > 1:筛选出同组内非第一条的记录,也就是需要删除的重复项
方法2:关联删除(适配不支持窗口函数的旧版数据库)
DELETE t1 FROM your_table t1 JOIN your_table t2 ON t1.ID = t2.ID AND t1.OrgName = t2.OrgName AND t1.TaxID = t2.TaxID WHERE -- 仅删除组内存在IsActive=1,但自身IsActive≠1的重复项 t2.IsActive = 1 AND t1.IsActive != 1;
代码说明
- 通过自连接匹配同组的重复记录
- 只处理存在
IsActive=1的组,删除组内所有非激活状态的重复项;对于没有IsActive=1的组(比如ID=2的XYZ组),不会做任何删除操作,留待后续需求补充后调整
执行后预期结果
处理完成后,你的数据表会变成:
| ID | OrgName | TaxID | IsActive |
|---|---|---|---|
| 1 | Miller | 111 | 1 |
| 2 | XYZ | 222 | 0 |
完全符合你要求的保留规则。
内容的提问来源于stack exchange,提问作者Arpit Patel
相关产品推荐
相关产品推荐

