使用oracle

时间:2015-06-04 16:59:26

标签: sql oracle loops date sql-delete

我有一张看起来像这样的表:

| 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。因此,在此示例中,我将仅删除第3个第6个行。

我知道我需要某种循环结构来实现这一目标,但我不知道如何,因为我一次真正看到两行。我如何在Oracle中实现这一目标?

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

1 个答案:

答案 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)