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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:20:48