2015-06-04 3 views
3

У меня есть таблица, которая выглядит примерно так:Сравнение последовательных строк с использованием оракула

| 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 должна быть удалена).

ответ

4

Вы можете использовать функцию 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) 
+0

В случае, если вы не знакомы с функцией LAG см (http://docs.oracle.com/cd/ B19306_01/server.102/b14200/functions070.htm) LAG позволяет вам получить доступ к нескольким строкам сразу без использования самостоятельного соединения. – Nathan

+0

На самом деле мне удалено больше строк, чем я предполагал, и удаляет строки 4 и 7. Я должен был быть более ясным, я хочу, чтобы он проходил через каждую строку, сравнивал значение from_date с предыдущим значением to_date, а если раньше, удалите эту строку. Я собираюсь изменить свой вопрос, чтобы это отразить. – mjavon

+0

Поцарапайте свой комментарий - я ошибочно заменил «rowid» на «id», когда я его ввел. Я не понимал, что «rowid» был особенным, спасибо! – mjavon

Смежные вопросы