PostgreSQL删除重复数据:保留最新记录的实现问题
PostgreSQL 删除重复记录(保留最新inserted_at)
PostgreSQL的CTE删除语法和SQL Server存在差异,以下是两种可行的正确写法,用于按id_store和id_client判断重复,仅删除inserted_at更早的旧记录:
方法1:使用CTE + 窗口函数
通过窗口函数为每组重复记录标记排序序号,保留序号为1的最新记录,删除序号大于1的旧记录:
WITH ranked_records AS ( SELECT id_insert, ROW_NUMBER() OVER ( PARTITION BY id_store, id_client ORDER BY inserted_at DESC ) AS rn FROM your_table_name -- 替换为你的实际表名 ) DELETE FROM your_table_name WHERE id_insert IN (SELECT id_insert FROM ranked_records WHERE rn > 1);
方法2:使用DELETE USING(高效关联删除)
直接关联表自身,找到同组中存在更新记录的旧数据并删除:
DELETE FROM your_table_name t1 USING your_table_name t2 WHERE t1.id_store = t2.id_store AND t1.id_client = t2.id_client AND t1.inserted_at < t2.inserted_at;
注意事项
- 务必将
your_table_name替换为实际的表名 - 执行删除前建议先通过SELECT语句验证目标记录,比如将DELETE改为SELECT *,确认要删除的是预期的旧数据
- 若
id_insert是主键或唯一键,方法1更稳妥;若表数据量较大,方法2的性能表现更佳
内容的提问来源于stack exchange,提问作者William Kliemann
相关产品推荐
相关产品推荐

