使用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|
已按ID
、From_Date
、To_date
排序。
我要做的是删除上一行from_date
早于to_date
且ID等于上一行ID的行。因此,在此示例中,我将仅删除 3rd 和 6th 行。
我知道我需要某种循环结构来完成此操作,但我不知道该怎么做,因为我实际上是一次查看两行。我如何在 Oracle 中完成此操作?
编辑:在使用 'LAG' 函数更快更容易的地方,我最终删除了 4th 和 7th 行也 - 这不是我想做的。例如,当它到达 行 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)
我有一个 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|
已按ID
、From_Date
、To_date
排序。
我要做的是删除上一行from_date
早于to_date
且ID等于上一行ID的行。因此,在此示例中,我将仅删除 3rd 和 6th 行。
我知道我需要某种循环结构来完成此操作,但我不知道该怎么做,因为我实际上是一次查看两行。我如何在 Oracle 中完成此操作?
编辑:在使用 'LAG' 函数更快更容易的地方,我最终删除了 4th 和 7th 行也 - 这不是我想做的。例如,当它到达 行 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)