У меня есть таблица, которая выглядит примерно так:Сравнение последовательных строк с использованием оракула
| 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 из предыдущей строки. Поэтому в этом примере я бы удалил 3rd и 6-й строк.
Я знаю, что мне нужна какая-то петлевая структура, но я не знаю, как я действительно смотрю на две строки за раз здесь. Как я могу это сделать в Oracle?
EDIT: Если с помощью функции «LAG» быстрее и проще, я в конечном итоге удаления четвёртую и 7th строк и - что не то, что я хочу сделать. Например, когда он доходит до строки 4, он должен сравнивать 'from_date' с 'to_date' от строки 2 (вместо строки 3, потому что строка 3 должна быть удалена).
В случае, если вы не знакомы с функцией LAG см (http://docs.oracle.com/cd/ B19306_01/server.102/b14200/functions070.htm) LAG позволяет вам получить доступ к нескольким строкам сразу без использования самостоятельного соединения. – Nathan
На самом деле мне удалено больше строк, чем я предполагал, и удаляет строки 4 и 7. Я должен был быть более ясным, я хочу, чтобы он проходил через каждую строку, сравнивал значение from_date с предыдущим значением to_date, а если раньше, удалите эту строку. Я собираюсь изменить свой вопрос, чтобы это отразить. – mjavon
Поцарапайте свой комментарий - я ошибочно заменил «rowid» на «id», когда я его ввел. Я не понимал, что «rowid» был особенным, спасибо! – mjavon