簡體   English   中英

Oracle-刪除重疊的記錄

[英]Oracle - Deleting overlapping records

由於在用數據填充表時出錯,現在該表中有錯誤的記錄。 特別是,存在重疊的時間戳。 現在,我要刪除記錄,這些記錄具有以下示例中所示的特征:

在此處輸入圖片說明

Insert into TEST_OVERLAP (TICKET_SK,TICKET_ID,VALID_FROM,VALID_TO) values ('1','3',to_timestamp('27.05.2016 17:27:08','DD.MM.RR HH24:MI:SSXFF'),to_timestamp('31.05.2016 18:34:16','DD.MM.RR HH24:MI:SSXFF'));
Insert into TEST_OVERLAP (TICKET_SK,TICKET_ID,VALID_FROM,VALID_TO) values ('2','3',to_timestamp('31.05.2016 18:34:16','DD.MM.RR HH24:MI:SSXFF'),to_timestamp('31.05.2016 18:34:26','DD.MM.RR HH24:MI:SSXFF'));
Insert into TEST_OVERLAP (TICKET_SK,TICKET_ID,VALID_FROM,VALID_TO) values ('3','3',to_timestamp('31.05.2016 18:34:26','DD.MM.RR HH24:MI:SSXFF'),to_timestamp('01.06.2016 08:56:51','DD.MM.RR HH24:MI:SSXFF'));
Insert into TEST_OVERLAP (TICKET_SK,TICKET_ID,VALID_FROM,VALID_TO) values ('4','3',to_timestamp('01.06.2016 08:56:51','DD.MM.RR HH24:MI:SSXFF'),to_timestamp('01.06.2016 18:38:30','DD.MM.RR HH24:MI:SSXFF'));
Insert into TEST_OVERLAP (TICKET_SK,TICKET_ID,VALID_FROM,VALID_TO) values ('5','3',to_timestamp('01.06.2016 18:38:30','DD.MM.RR HH24:MI:SSXFF'),to_timestamp('08.06.2016 15:23:22','DD.MM.RR HH24:MI:SSXFF'));
Insert into TEST_OVERLAP (TICKET_SK,TICKET_ID,VALID_FROM,VALID_TO) values ('6','3',to_timestamp('08.06.2016 15:23:22','DD.MM.RR HH24:MI:SSXFF'),to_timestamp('08.06.2016 21:02:21','DD.MM.RR HH24:MI:SSXFF'));
Insert into TEST_OVERLAP (TICKET_SK,TICKET_ID,VALID_FROM,VALID_TO) values ('7','3',to_timestamp('08.06.2016 17:09:02','DD.MM.RR HH24:MI:SSXFF'),to_timestamp('08.06.2016 19:04:05','DD.MM.RR HH24:MI:SSXFF'));
Insert into TEST_OVERLAP (TICKET_SK,TICKET_ID,VALID_FROM,VALID_TO) values ('8','3',to_timestamp('08.06.2016 19:04:05','DD.MM.RR HH24:MI:SSXFF'),to_timestamp('08.06.2016 21:02:21','DD.MM.RR HH24:MI:SSXFF'));
Insert into TEST_OVERLAP (TICKET_SK,TICKET_ID,VALID_FROM,VALID_TO) values ('9','3',to_timestamp('08.06.2016 21:02:21','DD.MM.RR HH24:MI:SSXFF'),to_timestamp('09.09.9999 00:00:00','DD.MM.RR HH24:MI:SSXFF'));
Insert into TEST_OVERLAP (TICKET_SK,TICKET_ID,VALID_FROM,VALID_TO) values ('10','6',to_timestamp('20.06.2016 21:23:48','DD.MM.RR HH24:MI:SSXFF'),to_timestamp('20.06.2016 21:23:56','DD.MM.RR HH24:MI:SSXFF'));
Insert into TEST_OVERLAP (TICKET_SK,TICKET_ID,VALID_FROM,VALID_TO) values ('11','6',to_timestamp('20.06.2016 21:23:56','DD.MM.RR HH24:MI:SSXFF'),to_timestamp('21.06.2016 08:59:16','DD.MM.RR HH24:MI:SSXFF'));
Insert into TEST_OVERLAP (TICKET_SK,TICKET_ID,VALID_FROM,VALID_TO) values ('12','6',to_timestamp('21.06.2016 08:22:35','DD.MM.RR HH24:MI:SSXFF'),to_timestamp('21.06.2016 08:23:02','DD.MM.RR HH24:MI:SSXFF'));
Insert into TEST_OVERLAP (TICKET_SK,TICKET_ID,VALID_FROM,VALID_TO) values ('13','6',to_timestamp('21.06.2016 08:23:02','DD.MM.RR HH24:MI:SSXFF'),to_timestamp('21.06.2016 08:59:16','DD.MM.RR HH24:MI:SSXFF'));
Insert into TEST_OVERLAP (TICKET_SK,TICKET_ID,VALID_FROM,VALID_TO) values ('14','6',to_timestamp('21.06.2016 08:59:16','DD.MM.RR HH24:MI:SSXFF'),to_timestamp('21.06.2016 12:06:49','DD.MM.RR HH24:MI:SSXFF'));
Insert into TEST_OVERLAP (TICKET_SK,TICKET_ID,VALID_FROM,VALID_TO) values ('15','6',to_timestamp('21.06.2016 12:06:49','DD.MM.RR HH24:MI:SSXFF'),to_timestamp('22.06.2016 06:29:51','DD.MM.RR HH24:MI:SSXFF'));
Insert into TEST_OVERLAP (TICKET_SK,TICKET_ID,VALID_FROM,VALID_TO) values ('16','6',to_timestamp('22.06.2016 06:29:51','DD.MM.RR HH24:MI:SSXFF'),to_timestamp('22.06.2016 08:18:18','DD.MM.RR HH24:MI:SSXFF'));
Insert into TEST_OVERLAP (TICKET_SK,TICKET_ID,VALID_FROM,VALID_TO) values ('17','6',to_timestamp('22.06.2016 08:18:18','DD.MM.RR HH24:MI:SSXFF'),to_timestamp('22.06.2016 08:24:58','DD.MM.RR HH24:MI:SSXFF'));
Insert into TEST_OVERLAP (TICKET_SK,TICKET_ID,VALID_FROM,VALID_TO) values ('18','6',to_timestamp('22.06.2016 08:24:58','DD.MM.RR HH24:MI:SSXFF'),to_timestamp('22.06.2016 08:38:18','DD.MM.RR HH24:MI:SSXFF'));
Insert into TEST_OVERLAP (TICKET_SK,TICKET_ID,VALID_FROM,VALID_TO) values ('19','6',to_timestamp('22.06.2016 08:38:18','DD.MM.RR HH24:MI:SSXFF'),to_timestamp('09.09.9999 00:00:00','DD.MM.RR HH24:MI:SSXFF'));

每個ticket_id刪除的記錄數量也可能大於2。

怎么辦呢?

如果我正確理解, ticket_id刪除包含具有相同ticket_id記錄和完全包含該記錄的時間范圍的記錄的ticket_id記錄。

這是完成任務的查詢:

DELETE tickets t
WHERE EXISTS (
    SELECT *
    FROM tickets t2
    WHERE t2.ticket_id  =  t.ticket_id
      AND t2.valid_from <  t.valid_from
      AND t2.valid_to   >= t.valid_to
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM