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

如何按日期删除MySQL表中昨日重复数据并保留最新记录

MySQL 仅删除昨日重复数据实现方案

直接在你原来的全局去重语句基础上,增加昨日时间范围过滤即可,确保去重逻辑只在昨日生成的数据集内部生效,不会改动非昨日的记录。

按id去重的基础版本

如果你的去重规则和原有逻辑一致,仅以id作为重复判断依据,同id只保留pid最大的条目,直接使用下面的SQL:

DELETE n1 
FROM data n1, data n2 
WHERE 
  n1.pid < n2.pid 
  AND n1.id = n2.id
  -- 关键:两张关联表都要加昨日时间过滤,避免跨天匹配误删数据
  AND DATE(n1.created) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)
  AND DATE(n2.created) = DATE_SUB(CURDATE(), INTERVAL 1 DAY);

不要只给单表加时间条件,否则会出现昨日数据和非昨日同id数据跨天比对的情况,误删昨日需要保留的最大pid记录。

适配示例场景的多字段去重版本

从你给出的预期结果看,实际需要删除的是除pid外其余字段完全一致的重复条目:比如示例中pid13和14的serviceid、id、created完全相同,属于要清理的重复内容;pid12虽然id相同,但serviceid、created和其他条目不一致,不需要删除。这种情况只需要在WHERE条件中补充其他重复判断字段即可:

DELETE n1 
FROM data n1, data n2 
WHERE 
  n1.pid < n2.pid 
  -- 联合判断重复的字段,可根据自身业务规则调整
  AND n1.id = n2.id
  AND n1.serviceid = n2.serviceid
  AND n1.created = n2.created
  -- 仅处理昨日数据
  AND DATE(n1.created) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)
  AND DATE(n2.created) = DATE_SUB(CURDATE(), INTERVAL 1 DAY);

执行这个语句后的结果和你的预期完全一致:6月14日的两条记录因为不属于昨日数据,全部保留;6月15日的记录里,仅pid13属于重复项会被删除,pid12、14正常保留。

注意事项

  • 正式执行删除前,先把语句开头的DELETE n1替换成SELECT n1.*执行,核对查询出的待删除记录符合预期后,再执行删除操作,避免误删数据。
  • 如果业务定义的“昨日”是滚动24小时而非自然日,可以把时间条件替换为n1.created >= DATE_SUB(NOW(), INTERVAL 1 DAY) AND n1.created < CURDATE(),n2的时间条件做相同修改即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 03:31:01