如何删除仅date_load不同的重复行,保留最新更新记录?
解决SQL删除重复行、仅保留最新date_load记录的问题
原代码的问题
你写的CTE里select后面多了个多余的逗号,这会直接导致语法错误,先把这个改掉。另外原select没把date_load列查出来,你没法直观看到选中的是不是11/19的旧数据,这也是结果不符合预期的原因之一。
修改后的验证与删除代码
先验证要删除的行(先跑这个确认结果)
with todelete as ( select [employee], [ID], [punch_start], [punch_end], [punch_hours], [date_load], -- 加上这列,方便你确认是不是要删的旧数据 row_number() over ( -- 按除date_load外的所有列分组,判断重复 partition by [employee], [ID], [punch_start], [punch_end], [punch_hours] -- 按date_load降序排,最新的记录seqnum=1 order by [date_load] desc ) as seqnum from [dbo].[dataset] ) -- 这里选seqnum>1的就是所有旧的重复行 select * from todelete where seqnum > 1;
确认无误后执行删除
如果上面的select结果确实是你要删的11/19旧数据,就可以执行删除:
with todelete as ( select [employee], [ID], [punch_start], [punch_end], [punch_hours], row_number() over ( partition by [employee], [ID], [punch_start], [punch_end], [punch_hours] order by [date_load] desc ) as seqnum from [dbo].[dataset] ) delete d from [dbo].[dataset] d inner join todelete t on d.employee = t.employee and d.ID = t.ID and d.punch_start = t.punch_start and d.punch_end = t.punch_end and d.punch_hours = t.punch_hours where t.seqnum > 1;
核心逻辑说明
partition by后面必须把除了date_load之外的所有列都加上,这样才能保证只有这些列完全一致的行才会被判定为重复行。order by [date_load] desc会让同一组重复行里,date_load最新的那行得到seqnum=1,剩下的旧行seqnum都会大于1,这就是我们要删除的目标。- 一定要先跑select验证结果,确认是要删的旧数据再执行删除,避免误操作。
内容的提问来源于stack exchange,提问作者Java
相关产品推荐
相关产品推荐

