将重复记录合并为具有相同表和表字段的1条记录

时间:2010-08-09 07:09:14

标签: sql postgresql function

我有一个包含人口统计记录列表的数据库表,其中一些参与者可能有多个/重复记录,例如:

注意:
性别:
119 =男性 118 =女性

种族:
255 =白色 253 =亚洲人

UrbanRural:
331 =城市
332 =农村

participantid, gender, race, urbanrural, moduletypeid, hibernateid, and more fields
1, 119, 0, 331, 1, 1, .....
1, 119, 255, 0, 2, 2, .....
1, 0, 255, 331, 3, 3, .....
1, 119, 253, 331, 0, 4, .....

输出应保留第一个hibernateid,重复记录将合并到第一个hibernatedid记录。如果您可以使用将检查记录的函数来执行此操作,如果重复这些记录会很好,在合并记录之后它将删除未使用的重复记录。你的回答让我很好地解决了这个问题。感谢

输出应为:

participantid, gender, race, urbanrural, moduletypeid, hibernateid, and more fields
1, 119, 255, 331, 1, 1, .....


帮助我们,谢谢

4 个答案:

答案 0 :(得分:2)

尝试类似:

select participantid, min(gender), min(race), min(urbanrural), 
min(case moduletypeid when 0 then null else moduletypeid end), min(hibernateid), ...
from yourtable
group by participantid

我不清楚为什么在你的例子中将moduletypeid作为1返回 - 我假设这个字段中的0是一个特殊情况,被视为null(因此是case子句)。

答案 1 :(得分:1)

你可以在Postgres 9.1 +中做这样的事情:

WITH duplicates AS (
  SELECT desired_unique_key, count(*) AS count_of_same_key, min(st.id) AS keep_id, max(st.id) as delete_id
  FROM source_table st
  GROUP BY desired_unique_key
  HAVING count(*) > 1
),
 deleted_dupes AS (
  DELETE FROM source_table st
  WHERE st.id IN (SELECT(delete_id) FROM duplicates)
)
UPDATE source_table st
  SET field = WHATEVER
  FROM duplicates d
  WHERE st.id = d.keep_id

答案 2 :(得分:1)

我正在做类似的事情(postgres),但是我还没有测试过。

SELECT dup.id AS dup_id, orig.id AS orig_id
INTO TEMP specialty_duplicates
FROM medical_specialty dup,
        (SELECT DISTINCT ON (name) * FROM medical_specialty ORDER BY name, id) orig
WHERE orig.name = dup.name AND dup.id <> orig.id;


UPDATE doctor_medical_specialty
SET medical_specialty=orig_id
FROM specialty_duplicates
WHERE medical_specialty = dup_id;

DELETE
FROM medical_specialty
WHERE id IN (SELECT dup_id FROM specialty_duplicates);

ALTER TABLE medical_specialty
    ADD UNIQUE (name);

该模式是medical_specialty具有ID和名称,而doctor_medical_specialty通过ID对其进行引用。

相对于CTE(IIUC)的好处是您可以将多个引用表中的引用合并。

我使用的是临时表而不是视图,以便删除和更新都与同一时间的快照保持一致

答案 3 :(得分:0)

所以你想要一个查询来查找/删除重复项,是吗?

如果是这样,试试这个:

SELECT T1.* FROM table_name T1, table_name T2
WHERE T1.dupe_field = T2.dupe_field
AND T1.other_dupe_field = T2.other_dupe_field
AND T1.primary_key > T2.primary_key;

更改表和字段名称以适合您自己的表结构。

使用此SELECT查询确认它正在选择要删除的对齐,然后将其更改为DELETE以删除欺骗。