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_date比to_date前一行更早的行,ID等于上一行的ID.所以在这个例子中,我只会删除第3行和第6行.
我知道我需要某种循环结构才能实现这一目标,但我不知道为什么我一直在这里看两行.我怎样才能在Oracle中实现这一目标?
编辑:使用'LAG'功能更快更容易,我最终也删除了第4行和第7行 - 这不是我想要做的.例如,当它到达第4行时,它应该将'from_date'与第2行的'to_date'进行比较(而不是第3行,因为第3行应该被删除).
您可以使用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)