Oracle
 sql >> Database >  >> RDS >> Oracle

i record duplicati devono eliminare Oracle db

Le righe sono identiche ad eccezione dell'ID e del timestamp di creazione. Per trovare i duplicati, devi confrontare tutte le altre colonne:

La query, trovando entrambe le righe cercando duplicati con un altro 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 ...
);

L'istruzione delete mantiene solo una riga di un gruppo di duplicati confrontando 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 vuoi limitarlo a una data e un'ora particolari, fallo.

where exists (...) and api_date = date '2020-09-27' and api_hour = 17

Quindi hai a che fare solo con una parte della tabella, ma devi assicurarti che il DBMS possa trovare questi dati rapidamente (e non dover leggere la tabella delle buche ancora e ancora). Fornisci un indice per questo:

create index idx1 on hourly_report_table (api_date, api_hour);