Řádky jsou identické s výjimkou jejich ID a časového razítka vytvoření. Chcete-li najít duplikáty, musíte porovnat všechny ostatní sloupce:
Dotaz, hledání obou řádků hledáním duplikátů s jiným ID (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 ...
);
Příkaz delete zachovává pouze jeden řádek skupiny duplikátů porovnáním 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 ...
);
Pokud to chcete omezit na konkrétní datum a hodinu, udělejte to.
where exists (...) and api_date = date '2020-09-27' and api_hour = 17
Zabýváte se tedy pouze částí tabulky, ale musíte zajistit, aby DBMS tato data rychle našla (a nemusela znovu a znovu číst tabulku děr). Zadejte pro to index:
create index idx1 on hourly_report_table (api_date, api_hour);