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

如何删除仅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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 15:43:34