SQL Server表重复数据删除需求:基于col1-col3删除col6-col8均为0的重复行
解决SQL Server重复数据删除问题
我来帮你搞定这个重复数据清理的需求,针对你的SQL Server表,我们可以用CTE(公共表表达式)结合窗口函数来精准删除目标重复行,具体方案如下:
核心思路
我们需要先按col1、col2、col3分组识别重复数据,然后在每个重复组里,只删除那些同时满足col6=0、col7=0、col8=0的重复行(保留每组里至少一行,优先保留非0的行)。
具体SQL代码
首先,用ROW_NUMBER()窗口函数给每个重复组的行编号,把要删除的0行排在组内的后面,这样就能精准筛选出要删除的记录:
WITH DuplicateRows AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY col1, col2, col3 ORDER BY -- 把非0的行排在前面,确保它们的RowNum为1(保留) CASE WHEN col6 = 0 AND col7 = 0 AND col8 = 0 THEN 1 ELSE 0 END, -- 可以加上其他字段辅助排序,保证编号逻辑稳定 col4, col5, col9, col10 ) AS RowNum FROM YourTableName -- 替换成你的实际表名 ) -- 删除重复组里RowNum>1且满足三个0条件的行 DELETE FROM DuplicateRows WHERE RowNum > 1 AND col6 = 0 AND col7 = 0 AND col8 = 0;
验证与注意事项
- 先验证再删除:执行DELETE前,建议先把语句改成
SELECT * FROM DuplicateRows WHERE ...,检查要删除的行是否符合预期,避免误删数据。 - 表名替换:记得把
YourTableName替换成你实际使用的表名称。 - 主键优化:如果你的表有主键(比如
id列),可以把主键加到ORDER BY子句里,让编号逻辑更精准。 - 特殊场景处理:如果某个重复组里所有行都是
col6=0、col7=0、col8=0,这个方案会保留RowNum=1的那一行,其他重复的0行被删除,符合“删除重复行”的需求。
内容的提问来源于stack exchange,提问作者yhassany
相关产品推荐
相关产品推荐

