Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Удаление дубликатов  [new]
Wasteland Rebel
Member

Откуда:
Сообщений: 17
Имеется следующая таблица:
CREATE TABLE analytics.google_analytic_report (
	account_login text NOT NULL,
	account_view_id text NOT NULL,
	report_date date NOT NULL,
	utm_marks text NOT NULL,
	metric_name text NOT NULL,
	metric_value numeric NULL,
	account_id int4 NOT NULL,
	CONSTRAINT google_analytic_report_pk PRIMARY KEY (account_view_id, account_id, report_date, utm_marks, metric_name)
);

В таблице начали появляться дубликаты из-за некорректного PRIMARY KEY. Хочу убрать account_id (потому что для аккаунтов могут быть одинаковые view_id, и статистика загружается дважды под разными id, хотя в этом нет никакого смысла) из PK, но для этого сначала необходимо удалить уже имеющиеся дубликаты.

Дубликаты искал следующим запросом:
select account_view_id, report_date, utm_marks, metric_name, count(*)
from analytics.google_analytic_report
group by account_view_id, report_date, utm_marks, metric_name
HAVING count(*) > 1

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

Скрипт на удаление будет выглядеть примерно так?

DELETE FROM analytics.google_analytic_report t1
  USING      analytics.google_analytic_report t2
WHERE  t1.account_id    < t2.account_id
  AND  t1.account_view_id   = t2.account_view_id     
  AND  t1.report_date = t2.report_date
  AND  t1.utm_marks = t2.utm_marks
  AND  t1.metric_name = t2.metric_name;


Т.е. я должен весь primary key положить в условие where, а условие t1.account_id < t2.account_id нужно для того, чтобы как раз остался один набор? Я просто боюсь удалить лишнее.
15 фев 21, 12:30    [22281039]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дубликатов  [new]
Misha111
Member

Откуда:
Сообщений: 36
Wasteland Rebel,

напишите селект - полный аналог делита и посмотрите что вернет
15 фев 21, 15:30    [22281182]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дубликатов  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3646
delete from analytics.google_analytic_report where ctid not in
(
select min(ctid)
from analytics.google_analytic_report
group by account_view_id, report_date, utm_marks, metric_name
)
17 фев 21, 13:09    [22282217]     Ответить | Цитировать Сообщить модератору
 Re: Удаление дубликатов  [new]
chatlanin44
Member

Откуда:
Сообщений: 1
Когда боишься удалить лишнее - сохрани дубли в таблицу
17 фев 21, 19:23    [22282450]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить