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;
语句说明
- CTE分组标记:仅针对
Id和name均为NULL的行,按Object_Name分组后,以insert_date降序排序,最新的行编号为1,其余重复行编号大于1。 - 精准删除:通过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
相关产品推荐
相关产品推荐

