行は、IDと作成タイムスタンプを除いて同一です。重複を見つけるには、他のすべての列を比較する必要があります:
別の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 ...
);
t2.id < t1.id
を比較することにより、重複グループの1行のみを保持するdeleteステートメント :
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 ...
);
これを特定の日時に制限する場合は、そうしてください。
where exists (...) and api_date = date '2020-09-27' and api_hour = 17
したがって、テーブルの一部のみを処理しますが、DBMSがこのデータをすばやく見つけることができることを確認する必要があります(ホールテーブルを何度も読み取る必要はありません)。このためのインデックスを提供します:
create index idx1 on hourly_report_table (api_date, api_hour);