Wiersze są identyczne, z wyjątkiem ich identyfikatora i sygnatury czasowej utworzenia. Aby znaleźć duplikaty, musisz porównać wszystkie inne kolumny:
Zapytanie, które znajduje oba wiersze, szukając duplikatów z innym identyfikatorem (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 ...
);
Instrukcja delete zachowuje tylko jeden wiersz z grupy duplikatów, porównując 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 ...
);
Jeśli chcesz ograniczyć to do określonej daty i godziny, zrób to.
where exists (...) and api_date = date '2020-09-27' and api_hour = 17
W ten sposób masz do czynienia tylko z częścią tabeli, ale musisz upewnić się, że DBMS może szybko znaleźć te dane (i nie musi ciągle czytać tabeli otworów). Podaj indeks:
create index idx1 on hourly_report_table (api_date, api_hour);