SQL如何删除近24小时内同一用户超过3条的条目,仅保留最早的3条?
实现SQL(按数据库支持情况选择)
1. 支持窗口函数的数据库(MySQL 8.0+/PostgreSQL/SQL Server/Oracle等)
优先使用窗口函数实现,逻辑更清晰:
DELETE t FROM 你的表名 t INNER JOIN ( SELECT Name, `Date`, -- 按用户分组,时间升序排序生成行号 ROW_NUMBER() OVER(PARTITION BY Name ORDER BY `Date` ASC) AS row_num FROM 你的表名 -- 筛选近24小时的记录 WHERE `Date` >= NOW() - INTERVAL 24 HOUR ) AS ranked_records ON t.Name = ranked_records.Name AND t.`Date` = ranked_records.`Date` -- 只删除行号超过3的记录,保留最早3条 WHERE ranked_records.row_num > 3;
注意:如果表存在主键字段,建议用主键做关联条件,避免同用户同时间的重复记录误删,关联条件改为
t.主键字段 = ranked_records.主键字段即可。
2. 不支持窗口函数的低版本数据库(如MySQL 5.x)
可使用关联子查询实现:
DELETE t FROM 你的表名 t WHERE `Date` >= NOW() - INTERVAL 24 HOUR AND 3 < ( SELECT COUNT(*) FROM 你的表名 t1 WHERE t1.Name = t.Name AND t1.`Date` >= NOW() - INTERVAL 24 HOUR AND t1.`Date` < t.`Date` );
注意事项
执行删除前建议先将语句中的DELETE t替换为SELECT *,确认待删除的记录符合预期后再执行删除操作,避免数据误丢失。
内容的提问来源于stack exchange,提问作者Gops61
相关产品推荐
相关产品推荐

