MySQL实现删除重复数据并保留最新记录的操作
方法一:使用窗口函数(推荐,需 MySQL 8.0+)
-- 使用 CTE 标记重复记录
WITH CTE AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY point_code ORDER BY create_time DESC) AS rn FROM nm_sf_ky_relation ) -- 删除重复记录(保留每组最新的一条) DELETE FROM nm_sf_ky_relation WHERE (point_code, create_time) IN ( SELECT point_code, create_time FROM CTE WHERE rn > 1 );
原理:
ROW_NUMBER()为每个point_code分组内的记录按create_time降序排列,生成行号rn。- 删除
rn > 1的记录,即保留每组最新的一条
优势:
- 无需临时表,直接通过窗口函数实现。
- 性能较好,尤其适合大数据量场景
方法二:使用自连接删除(兼容旧版本 MySQL)
-- 删除重复记录(保留每组最新的一条)
DELETE t1 FROM nm_sf_ky_relation t1 JOIN nm_sf_ky_relation t2 ON t1.point_code = t2.point_code AND t1.create_time < t2.create_time;
根据您的需求,可以通过以下两种方法实现删除重复数据并保留最新记录的操作:
原理:
- 自连接表
t1和t2,筛选出t1中create_time小于t2的记录(即保留t2的最新记录)。 - 删除
t1中符合条件的重复记录
注意:
- 此方法可能受限于索引,建议在
point_code和create_time上创建联合索引以加速查询:
CREATE INDEX idx_point_create ON nm_sf_ky_relation (point_code, create_time);

浙公网安备 33010602011771号