Редовете са идентични, с изключение на техния идентификатор и време на създаване. За да намерите дубликати, трябва да сравните всички други колони:
Заявката, намираща и двата реда чрез търсене на дубликати с друг идентификатор (t2.id <> t1.id
):
select *
from hourly_report_table t1
where exists
(
select *
from hourly_report_table t2
where t2.id <> t1.id
and t2.application = t1.application
and t2.api_date = t1.api_date
and t2.api_hour = t1.api_hour
and ...
);
Операторът за изтриване запазва само един ред от група дубликати чрез сравняване на t2.id < t1.id
:
delete
from hourly_report_table t1
where exists
(
select *
from hourly_report_table t2
where t2.id < t1.id
and t2.application = t1.application
and t2.api_date = t1.api_date
and t2.api_hour = t1.api_hour
and ...
);
Ако искате да ограничите това до определена дата и час, направете го.
where exists (...) and api_date = date '2020-09-27' and api_hour = 17
Така вие работите само с част от таблицата, но трябва да сте сигурни, че СУБД може да намери тези данни бързо (и да не се налага да четете таблицата с дупки отново и отново). Предоставете индекс за това:
create index idx1 on hourly_report_table (api_date, api_hour);