As linhas são idênticas, exceto por seu ID e carimbo de data/hora de criação. Para encontrar duplicatas, você deve comparar todas as outras colunas:
A consulta, encontrando ambas as linhas procurando duplicatas com outro 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 ...
);
A instrução delete mantém apenas uma linha de um grupo de duplicatas comparando
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 ...
);
Se você quiser restringir isso a uma data e hora específicas, faça isso.
where exists (...) and api_date = date '2020-09-27' and api_hour = 17
Assim, você está lidando apenas com parte da tabela, mas deve certificar-se de que o SGBD possa encontrar esses dados rapidamente (e não ter que ler a tabela de furos repetidamente). Forneça um índice para isso:
create index idx1 on hourly_report_table (api_date, api_hour);