Rækkerne er identiske bortset fra deres id og oprettelsestidsstempel. For at finde dubletter skal du sammenligne alle andre kolonner:
Forespørgslen, der finder begge rækker ved at lede efter dubletter med et andet 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 ...
);
Sletsætningen beholder kun én række af en gruppe af dubletter ved at sammenligne 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 ...
);
Hvis du vil begrænse dette til en bestemt dato og et bestemt tidspunkt, skal du gøre det.
where exists (...) and api_date = date '2020-09-27' and api_hour = 17
Du har altså kun at gøre med en del af tabellen, men du skal sørge for, at DBMS kan finde disse data hurtigt (og ikke at skulle læse hultabellen igen og igen). Angiv et indeks for dette:
create index idx1 on hourly_report_table (api_date, api_hour);