pg数据库中重复数据如何快速保留一条

在 PostgreSQL 中删除重复数据但保留一条,可以使用 ROW_NUMBER() 窗口函数结合 DELETE 语句。以下是具体步骤:

1. 先确认要删除的重复数据(可选)

sql

SELECT *
FROM (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY fxgc_id ORDER BY id) AS rn
  FROM periodic_check_result
  WHERE status IS NULL
) AS sub
WHERE rn > 1;

2. 执行删除操作

sql

-- 使用 CTE 定位要删除的行
WITH duplicates AS (
  SELECT id,
    ROW_NUMBER() OVER (
      PARTITION BY fxgc_id 
      ORDER BY id -- 按 id 排序,保留第一条(可调整排序规则)
    ) AS rn
  FROM periodic_check_result
  WHERE status IS NULL
)
DELETE FROM periodic_check_result
WHERE id IN (
  SELECT id
  FROM duplicates
  WHERE rn > 1
);

关键点解释

  1. ROW_NUMBER()
    按 fxgc_id 分组,为每组内的重复数据生成行号(rn),行号从 1 开始递增。

  2. PARTITION BY fxgc_id
    表示按 fxgc_id 分组,每个 fxgc_id 单独计算行号。

  3. ORDER BY id
    按 id 排序(假设表中有自增主键 id),最终保留每组中 id 最小的记录。
    如果要保留最新记录,可改为 ORDER BY id DESC

  4. WHERE status IS NULL
    仅在 status 为空的记录中查找重复项。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值