我有一个包含人口统计记录列表的数据库表,其中一些参与者可能有多个/重复记录,例如:
注意:
性别:
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, .....
帮助我们,谢谢
答案 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以删除欺骗。