sql >> Base de Datos >  >> RDS >> Oracle

los registros duplicados deben eliminar Oracle db

Las filas son idénticas excepto por su ID y la marca de tiempo de creación. Para encontrar duplicados, debe comparar todas las demás columnas:

La consulta, encontrando ambas filas buscando duplicados con otra 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 ...
);

La declaración de eliminación solo mantiene una fila de un grupo de duplicados al comparar 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 ...
);

Si desea restringir esto a una fecha y hora en particular, hágalo.

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

Por lo tanto, solo está tratando con una parte de la tabla, pero debe asegurarse de que el DBMS pueda encontrar estos datos rápidamente (y no tener que leer la tabla de agujeros una y otra vez). Proporcione un índice para esto:

create index idx1 on hourly_report_table (api_date, api_hour);