基于日期去重的数据库清洗需求:保留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
相关产品推荐
相关产品推荐

