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

PostgreSQL删除重复记录并保留最新记录的SQL查询问题

解决PostgreSQL删除指定重复记录的问题

需求说明

删除Object_Name相同且Id、name均为NULL的重复行,仅保留该分组中insert_date最新的记录;其余不满足Id和name同时为NULL的行(比如示例中的b行)需保留。

正确的删除语句

使用窗口函数ROW_NUMBER()标记需删除的重复行:

WITH ranked_rows AS (
    SELECT 
        *,
        ROW_NUMBER() OVER (
            PARTITION BY Object_Name 
            ORDER BY insert_date DESC
        ) AS rn
    FROM your_table_name
    WHERE Id IS NULL AND name IS NULL
)
DELETE FROM your_table_name
USING ranked_rows
WHERE your_table_name.ctid = ranked_rows.ctid
AND ranked_rows.rn > 1;

语句说明

  1. CTE分组标记:仅针对Id和name均为NULL的行,按Object_Name分组后,以insert_date降序排序,最新的行编号为1,其余重复行编号大于1。
  2. 精准删除:通过PostgreSQL系统列ctid关联原表与CTE结果,删除编号大于1的重复行,保留每组中最新的记录。

原语句问题分析

你之前尝试的语句逻辑不符合需求:

Delete from table
where object_name in (select object_name from table except select max(object_name) from table group by object_name)
  • 该语句仅筛选不在分组max(object_name)中的object_name,既未限定Id、name为NULL的条件,也未关联insert_date排序逻辑,无法精准定位需要删除的重复行。

内容的提问来源于stack exchange,提问作者Ram

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 04:52:44