在 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
);
关键点解释
-
ROW_NUMBER()
按fxgc_id
分组,为每组内的重复数据生成行号(rn
),行号从 1 开始递增。 -
PARTITION BY fxgc_id
表示按fxgc_id
分组,每个fxgc_id
单独计算行号。 -
ORDER BY id
按id
排序(假设表中有自增主键id
),最终保留每组中id
最小的记录。
如果要保留最新记录,可改为ORDER BY id DESC
。 -
WHERE status IS NULL
仅在status
为空的记录中查找重复项。