SQL Server 2016查询结果集去重 删除重复行的实现方法
SQL Server 2016 结果集去重实现方案
核心逻辑说明
你之前使用ROW_NUMBER()窗口函数去重未生效,绝大多数情况是窗口函数的分组字段配置错误:你额外添加的参考RowID不属于业务字段,不能加入分组依据,PARTITION BY后必须跟所有你用来判定两行重复的业务字段,相同分组内的行即为重复行。
场景1:仅查询去重后的结果(不修改原始表数据)
WITH DuplicateCTE AS ( SELECT *, -- 替换PARTITION BY后字段为你实际用来判断重复的所有业务字段 ROW_NUMBER() OVER( PARTITION BY 业务字段1, 业务字段2, 业务字段3... -- 若重复行有保留优先级(如保留最早创建的),可替换为 ORDER BY 创建时间 ASC,无优先级写ORDER BY (SELECT 0)即可 ORDER BY (SELECT 0) ) AS RowNum FROM 你的业务表名 ) -- 仅取每个重复分组的第一条,即为去重后的结果 SELECT * FROM DuplicateCTE WHERE RowNum = 1;
场景2:直接删除表内的重复行
将上述代码的最后一句查询替换为删除语句即可:
WITH DuplicateCTE AS ( SELECT *, ROW_NUMBER() OVER( PARTITION BY 业务字段1, 业务字段2, 业务字段3... ORDER BY (SELECT 0) ) AS RowNum FROM 你的业务表名 ) -- 删除每个重复分组中除第一条外的所有重复行 DELETE FROM DuplicateCTE WHERE RowNum > 1;
常见失效原因排查
- 误将额外添加的参考RowID加入
PARTITION BY分组字段,导致每一行都是独立分组,RowNum全部为1,无去重效果 - 筛选条件写反,查询时误写为
WHERE RowNum > 1,返回结果全为重复行 - 漏加了部分判断重复的业务字段到
PARTITION BY中,导致分组逻辑不符合预期
内容的提问来源于stack exchange,提问作者LearnD1
相关产品推荐
相关产品推荐

