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

如何用row_number()窗口函数删除重复数据并保留最新行

你当前的DELETE语句会删掉所有重复的employee_id记录,问题出在子查询用了employee_id IN (...)——只要某个employee_id存在row_num>1的行,所有该employee_id的记录都会被匹配删除,而非只删冗余的重复行。

下面是两种修改方案,按需选择:

1. 保留最新一条重复记录(基于时间字段)

假设表中有记录更新/创建时间的字段(比如update_time),通过时间倒序让最新的行排第一,只删除row_num>1的冗余行:

DELETE FROM employee
WHERE id IN (
    SELECT id
    FROM (
        SELECT 
            id,
            ROW_NUMBER() OVER (
                PARTITION BY employee_id 
                ORDER BY update_time DESC  -- 按时间倒序,最新的行row_num=1
            ) AS row_num
        FROM employee
    ) t
    WHERE row_num > 1
)

注:如果表没有主键id,可以用(employee_id, update_time)组合作为匹配条件,替换上面的id

2. 保留任意一条重复记录(无顺序要求)

如果不需要指定保留最新/最早,只是随便留一条,用主键或任意字段排序即可:

DELETE FROM employee
WHERE id IN (
    SELECT id
    FROM (
        SELECT 
            id,
            ROW_NUMBER() OVER (
                PARTITION BY employee_id 
                ORDER BY id  -- 按主键排序,保留主键最小的行
            ) AS row_num
        FROM employee
    ) t
    WHERE row_num > 1
)

关键修改点

  • 把原查询中用来匹配的employee_id换成能唯一标识单条记录的字段(主键或唯一组合字段),避免误删整个employee_id的所有记录。
  • 通过ORDER BY子句控制保留哪一行:倒序时间留最新,正序主键留最早,按需调整排序规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:50:22