使用oracle比较连续的行

Comparing consecutive rows using oracle

我有一个 table 看起来像这样:

| 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|

已按IDFrom_DateTo_date排序。

我要做的是删除上一行from_date早于to_date且ID等于上一行ID的行。因此,在此示例中,我将仅删除 3rd6th 行。

我知道我需要某种循环结构来完成此操作,但我不知道该怎么做,因为我实际上是一次查看两行。我如何在 Oracle 中完成此操作?

编辑:在使用 'LAG' 函数更快更容易的地方,我最终删除了 4th7th 行也 - 这不是我想做的。例如,当它到达 行 4 时,它应该将 'from_date' 与来自 行 2 的 'to_date' 进行比较(而不是第 3 行,因为应该删除第 3 行)。

您可以使用 lag window 函数来识别这些行:

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)