Объединить дубликаты записей в 1 записи с одной и той же таблицей и полями таблицы - PullRequest
4 голосов
/ 09 августа 2010

У меня есть таблица базы данных, которая содержит список демографических записей, некоторые из этих участников могут иметь несколько / дубликаты записей, например,

ПРИМЕЧАНИЕ:
Пол:
119 = мужской
118 = женщина

Race:
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, .....


Помогите мне, ребята, спасибо

Ответы [ 3 ]

2 голосов
/ 09 августа 2010

Попробуйте что-то вроде:

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 в этом поле - особый случай, который следует рассматривать как ноль(отсюда и оговорка).

1 голос
/ 31 января 2013

Вы можете сделать что-то подобное в 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 голосов
/ 09 августа 2010

То есть вы хотите запрос найти / удалить дубликаты, верно?

Если так, попробуйте это:

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, что он выбирает дубликаты, которых вы хотите удалить, а затем измените их на УДАЛИТЬ, чтобы удалить дубликаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...