You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:15:01