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
相关产品推荐
相关产品推荐

