Установите для Duplicate Values ​​значение Null в PostgresSQL, сохранив одно из значений - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть база данных, подобная этой:

id    name    email
0     Bill    bill@fakeemail.com
1     John    john@fakeemail.com
2     Susan   susan@fakeemail.com
3     Susan J susan@fakeemail.com

Я хочу удалить дубликаты электронных писем, установив значение null, но сохранив по крайней мере 1 электронное письмо в одной из строк (на самом деле не имеет значения, какойone).

Чтобы итоговая база данных выглядела следующим образом:

id    name    email
0     Bill    bill@fakeemail.com
1     John    john@fakeemail.com
2     Susan   susan@fakeemail.com
3     Susan J 

Мне удалось настроить таргетинг на строки, подобные этой SELECT COUNT(email) as count FROM users WHERE count > 1

Но не могувыяснить, как установить значение в ноль, сохраняя при этом не менее 1.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Обновить строки, которые имеют одинаковые email, но больше id:

update my_table t1
set email = null
where exists (
    select from my_table t2
    where t1.email = t2.email and t1.id > t2.id
    );

Рабочий пример в rextester.

0 голосов
/ 27 февраля 2019

Вы можете использовать оконный раздел, чтобы назначить номер строки каждой группе электронной почты, а затем использовать этот сгенерированный номер строки, чтобы изменить все строки, кроме одной.Примерно так:

WITH annotated_persons AS(
SELECT
 id,
 name,
 email,
 ROW_NUMBER () OVER (PARTITION BY email) AS i
FROM
 persons;
)
UPDATE persons
SET email = null
WHERE id = annotated_persons.id AND annotated_persons.i <> 1

Возможно, вам придется использовать другой подзапрос, чтобы собрать идентификаторы лиц с номером строки! = 1, а затем изменить свой запрос на обновление на

WHERE id IN person_ids
* 1006.* Прошло некоторое время с тех пор, как я использовал окно.
...