Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

registros duplicados precisam excluir Oracle db


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);