De rijen zijn identiek, behalve hun ID en aanmaaktijdstempel. Om duplicaten te vinden, moet u alle andere kolommen vergelijken:
De zoekopdracht, beide rijen vinden door te zoeken naar duplicaten met een andere 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 ...
);
De delete-instructie behoudt slechts één rij van een groep duplicaten door t2.id < t1.id
te vergelijken :
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 ...
);
Als je dit wilt beperken tot een bepaalde datum en uur, doe dat dan.
where exists (...) and api_date = date '2020-09-27' and api_hour = 17
U heeft dus maar met een deel van de tabel te maken, maar u moet er wel voor zorgen dat het DBMS deze gegevens snel kan vinden (en de gatentabel niet steeds opnieuw te moeten lezen). Geef hiervoor een index op:
create index idx1 on hourly_report_table (api_date, api_hour);