Raderna är identiska förutom deras ID och tidsstämpel för skapande. För att hitta dubbletter måste du jämföra alla andra kolumner:
Frågan, hittar båda raderna genom att leta efter dubbletter med ett annat 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 ...
);
Delete-satsen behåller bara en rad i en grupp av dubbletter genom att jämföra 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 ...
);
Om du vill begränsa detta till ett visst datum och klockslag, gör det.
where exists (...) and api_date = date '2020-09-27' and api_hour = 17
Du har alltså bara att göra med en del av tabellen, men du måste se till att DBMS kan hitta dessa data snabbt (och inte behöva läsa håltabellen om och om igen). Ange ett index för detta:
create index idx1 on hourly_report_table (api_date, api_hour);