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
);

​​原理​​:

  1. ROW_NUMBER() 为每个 point_code 分组内的记录按 create_time 降序排列,生成行号 rn
  2. 删除 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;

根据您的需求,可以通过以下两种方法实现删除重复数据并保留最新记录的操作:

​​原理​​:

  1. 自连接表 t1 和 t2,筛选出 t1 中 create_time 小于 t2 的记录(即保留 t2 的最新记录)。
  2. 删除 t1 中符合条件的重复记录

​​注意​​:

  • 此方法可能受限于索引,建议在 point_code 和 create_time 上创建联合索引以加速查询:
     
CREATE INDEX idx_point_create ON nm_sf_ky_relation (point_code, create_time);
posted @ 2025-04-21 16:00  O波V步  阅读(134)  评论(0)    收藏  举报