PL / SQl, oracle 9i, удаление дублирующихся строк с помощью sql - PullRequest
1 голос
/ 03 февраля 2012

у нас есть сценарий, в котором нам нужно удалить все дублирующиеся строки из таблицы на основе метки времени.Структура таблицы выглядит следующим образом:

Item   Ref1   Ref2        Timestamp
1      A       test1      2/3/2012 10:00:00
1      A       test2      2/3/2012 11:00:00
1      A       test1      2/3/2012 12:00:00
2      A       prod1      2/3/2012 10:00:00
2      B       prod2      2/3/2012 11:00:00
2      A       prod2      2/3/2012 12:00:00

Таким образом, нам нужно удалить повторяющиеся строки из этой таблицы на основе item и ref1.как здесь у нас должна быть только 1 строка для элемента 1 и ref1 A с последней отметкой времени.То же самое для пункта 2, у нас должна быть только 1 строка для ссылки 1 с последней отметкой времени.

Любые указатели будут хорошими

Ответы [ 3 ]

3 голосов
/ 03 февраля 2012

Предполагая, что желаемым конечным результатом является таблица с этими 3 строками

Item   Ref1   Ref2        Timestamp
1      A       test1      2/3/2012 12:00:00
2      B       prod2      2/3/2012 11:00:00
2      A       prod2      2/3/2012 12:00:00

Что-то вроде

DELETE FROM table_name a
 WHERE EXISTS( SELECT 1
                 FROM table_name b
                WHERE a.item = b.item
                  AND a.ref1 = b.ref1
                  AND a.timestamp < b.timestamp );

должен работать при условии, что нет двух строк с одинаковыми Item и Ref1, у которых обе одинаковые Timestamp. Если может быть несколько строк с одинаковыми Item и Ref1, то оба имеют самый последний Timestamp и при условии, что вам все равно, какой из них вы сохраните

DELETE FROM table_name a
 WHERE EXISTS( SELECT 1
                 FROM table_name b
                WHERE a.item = b.item
                  AND a.ref1 = b.ref1
                  AND a.timestamp <= b.timestamp 
                  AND a.rowid     <  b.rowid);
1 голос
/ 03 февраля 2012

Вы можете запросить группировку записей по Item и Ref1, а затем удалить, где Item и Ref равны, и Timestamp <макс. </p>

select Item
     , Ref1
     , max(Timestamp) tm
  from table
 group by Item, Ref1

С результатами ...

delete from table where Item = ? and Ref1 = ? and Timestamp < ?
0 голосов
/ 03 февраля 2012

У меня нет установленной Oracle 9 под рукой, поэтому я не могу проверить это, но я считаю, что это может сработать:

  1. Создать представление, в котором списки добавляют «индексы»к вашим записям:

    SELECT ROW_NUMBER( ) OVER (PARTITION BY Item, Ref1 ORDER BY Timestamp DESC) ix, * FROM table

  2. Удалите записи из представления, где ix больше 1

...