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

SQL Server不使用Distinct将重复行内容改为NULL值如何实现

SQL Server重复行置NULL实现方案

你需要的效果可以借助ROW_NUMBER()窗口函数实现,核心逻辑是按重复判定字段分组,每组内按交易日期倒序排序,仅保留最新日期行的原始值,其余行所有字段返回NULL。

参考查询代码(仅查询不修改原表)

WITH RankedTransaction AS (
    SELECT
        RefNo,
        TrxDate,
        TrxID,
        -- PARTITION BY后为判定重复的字段,可根据业务规则调整
        ROW_NUMBER() OVER(PARTITION BY RefNo, TrxID ORDER BY TrxDate DESC) AS row_num
    FROM [你的实际表名]
)
SELECT
    CASE WHEN row_num = 1 THEN RefNo ELSE NULL END AS RefNo,
    CASE WHEN row_num = 1 THEN TrxDate ELSE NULL END AS TrxDate,
    CASE WHEN row_num = 1 THEN TrxID ELSE NULL END AS TrxID
FROM RankedTransaction

如果不需要保留NULL行,直接删除重复行,在末尾添加WHERE row_num = 1即可。

原表更新代码(直接修改原表数据)

如果需要直接修改原表把旧重复行置为NULL,可以用以下语句:

WITH RankedTransaction AS (
    SELECT
        RefNo,
        TrxDate,
        TrxID,
        ROW_NUMBER() OVER(PARTITION BY RefNo, TrxID ORDER BY TrxDate DESC) AS row_num
    FROM [你的实际表名]
)
UPDATE RankedTransaction
SET 
    RefNo = NULL,
    TrxDate = NULL,
    TrxID = NULL
WHERE row_num > 1

注意事项

  • 可根据实际业务的重复判定规则调整PARTITION BY后的字段,比如你现有代码中用到的Key1、Key2后10位、Key3等匹配条件,都可以加入分组逻辑
  • 执行更新操作前建议先备份数据,或先运行CTE部分确认行号排序规则符合预期后再执行更新

内容的提问来源于stack exchange,提问作者Arya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:30:00