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

基于日期去重的数据库清洗需求:保留Serial_ID最新记录

解决Asset_Table中Serial_ID重复记录的去重问题(保留最新日期条目)

针对你需要清理重复Serial_ID记录、只保留每个Serial_ID对应最新Date_Added条目的需求,这里提供几种不同数据库环境下的可行方案,你可以根据自己使用的数据库选择合适的方法:

通用方案(适用于SQL Server、PostgreSQL、Oracle 12c+)

使用CTE结合窗口函数ROW_NUMBER(),这是最直观且安全的方式,能清晰区分每条记录的优先级:

WITH RankedAssets AS (
    SELECT 
        Serial_ID,
        ISSI,
        Date_Added,
        -- 按Serial_ID分组,日期最新的记录排名为1
        ROW_NUMBER() OVER (PARTITION BY Serial_ID ORDER BY Date_Added DESC) AS rn
    FROM Asset_Table
)
-- 删除排名大于1的旧记录
DELETE FROM RankedAssets WHERE rn > 1;

如果只是想先验证结果(不修改原表),可以把DELETE换成SELECT *,查看筛选后的记录是否符合预期。

MySQL专属方案

如果使用MySQL(尤其是不支持CTE删除的旧版本),可以用自连接的方式删除旧记录:

DELETE a1
FROM Asset_Table a1
JOIN Asset_Table a2
ON a1.Serial_ID = a2.Serial_ID
-- 删除同一Serial_ID下日期更早的记录
WHERE a1.Date_Added < a2.Date_Added;

这个方法会自动处理同一Serial_ID下多条重复的情况,逐步删除所有早于最新日期的条目。

另一种通用查询/删除方式

你也可以先找出每个Serial_ID的最新日期,再删除不在这个集合内的记录:

DELETE FROM Asset_Table
WHERE (Serial_ID, Date_Added) NOT IN (
    SELECT Serial_ID, MAX(Date_Added)
    FROM Asset_Table
    GROUP BY Serial_ID
);

注意:如果你的Date_Added字段存在NULL值,这个方法需要额外处理NULL的情况,否则可能会遗漏记录。

安全操作建议

  • 操作前务必备份原表:数据删除后很难恢复,建议先导出备份或者创建临时表验证结果
  • 若表数据量较大,建议在业务低峰期执行操作,避免影响系统性能
  • 如果存在同一Serial_ID下多条记录Date_Added完全相同的情况,ROW_NUMBER()会随机保留一条;若想保留所有同日期的记录,可以将ROW_NUMBER()替换为RANK()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:39:05