2010-08-09 68 views
3

我有一個包含人口統計記錄列表的數據庫表,其中一些參與者可能有多個/重複記錄,例如,

注:
性別:
119 =男
118 =女
將重複記錄合併到具有相同表格和表格字段的1條記錄中

種族:
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

你有外鍵引用而煩惱? – crowne 2010-08-09 07:12:57

+0

hibernateid是唯一的值。 – 2010-08-09 07:20:47

回答

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以刪除模糊。

+0

謝謝感謝您的幫助,但我正在尋找合併記錄。 – 2010-08-09 10:19:15

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是一種特殊情況,將被視爲無效(因此案例條款)。

+0

謝謝感謝您的幫助。我更新了我的問題的描述來詳細說明這些記錄。 – 2010-08-10 09:20:29

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 
+0

wc的來源在哪裏?在最後一個地方? – 2013-10-17 22:18:18

+1

應該是'st.',現在就修好了 – Turadg 2013-10-19 19:10:20

相關問題