在 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 为空的记录中查找重复项。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐