我有一张看起来像这样的表:
| ID | FROM_DATE | TO_DATE |
------------------------------
| 1 | 1/1/2001 | 2/1/2001|
| 1 | 2/1/2001 | 3/1/2001|
| 1 | 2/1/2001 | 6/1/2001|
| 1 | 3/1/2001 | 4/1/2001|
| 2 | 1/1/2001 | 2/1/2001|
| 2 | 1/1/2001 | 6/1/2001|
| 2 | 2/1/2001 | 3/1/2001|
| 2 | 3/1/2001 | 4/1/2001|
已按ID
,From_Date
,To_date
排序。
我想要做的是删除前一行from_date
早于to_date
的行,ID等于上一行的ID。因此,在此示例中,我将仅删除第3个和第6个行。
我知道我需要某种循环结构来实现这一目标,但我不知道如何,因为我一次真正看到两行。我如何在Oracle中实现这一目标?
编辑:使用' LAG'函数更快更容易,我最终也删除 4th 和 7th 行 - 这不是我想要做的。例如,当它到达第4行时,它应该比较' from_date'到了'to_date'从第2行(而不是第3行,因为应删除第3行)。
答案 0 :(得分:6)
您可以使用lag
窗口函数来识别这些行:
DELETE FROM mytable
WHERE rowid IN (SELECT rowid
FROM (SELECT rowid, from_date,
LAG(to_date) OVER
(PARTITION BY id
ORDER BY from_date, to_date)
AS lag_to_date
FROM my_table) t
WHERE from_date < lag_to_date)