Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / PostgreSQL |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
Misha111 Member Откуда: Сообщений: 36 |
Wasteland Rebel, напишите селект - полный аналог делита и посмотрите что вернет |
15 фев 21, 15:30 [22281182] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
chatlanin44 Member Откуда: Сообщений: 1 |
Когда боишься удалить лишнее - сохрани дубли в таблицу |
17 фев 21, 19:23 [22282450] Ответить | Цитировать Сообщить модератору |
Все форумы / PostgreSQL | ![]() |