使用oracle比较连续的行

mja*_*von 4 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|
Run Code Online (Sandbox Code Playgroud)

它已经被排序ID,From_Date,To_date.

我想要做的是删除from_dateto_date前一行更早的行,ID等于上一行的ID.所以在这个例子中,我只会删除第3行和第6行.

我知道我需要某种循环结构才能实现这一目标,但我不知道为什么我一直在这里看两行.我怎样才能在Oracle中实现这一目标?

编辑:使用'LAG'功能更快更容易,我最终也删除了第4行和第7行 - 这不是我想要做的.例如,当它到达第4行时,它应该将'from_date'与第2行的'to_date'进行比较(而不是第3行,因为第3行应该被删除).

Mur*_*nik 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)
Run Code Online (Sandbox Code Playgroud)