удалить дубликаты записей, сохранить один - PullRequest
2 голосов
/ 23 августа 2011

У меня есть временная таблица, созданная из copy из CSV-файла, и результат содержит несколько дубликатов идентификаторов.Мне нужно удалить любое дублирование.Я пробовал следующее:

delete from my_table where id in
    (select id from (select count(*) as count, id
        from my_table group by id) as counts where count>1);

Однако при этом удаляются и дубликаты записей, и я должен сохранить один.

Как удалить только 2-ю запись с дублированным идентификатором?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 23 августа 2011

Ваш запрос удаляет все идентификаторы с числом больше 1, поэтому он удаляет все дублирующиеся. Что вам нужно сделать, это изолировать одну запись из списка дубликатов и сохранить это:

delete
from   my_table
where  id in     (select   id
                  from     my_table
                  where    some_field in (select   some_field
                                          from     my_table
                                          group by some_field
                                          having   count(id) > 1))
and    id not in (select   min(id)
                  from     my_table
                  where    some_field in (select   some_field
                                          from     my_table
                                          group by some_field
                                          having   count(id) > 1)
                  group by some_field);

РЕДАКТИРОВАТЬ Исправлено: P

1 голос
/ 23 августа 2011

При условии, что у вас нет связей с ключевыми ключами ...

CREATE TABLE "temp"(*column definitions*);

insert into "temp" (*column definitions*)
select *column definitions*
from (
        select *,row_number() over(PARTITION BY id) as rn from "yourtable"
) tm
where rn=1;

drop table "yourtable";

alter table "temp" rename to "yourtable";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...