Удаление дубликатов записей в Oracle на основе максимальной даты / времени - PullRequest
3 голосов
/ 16 ноября 2010

у меня есть следующие образцы данных с дублирующейся информацией:

ID   Date                 Emp_ID    Name    Keep
---------------------------------------------------------
1    17/11/2010 13:45:22  101       AB      *
2    17/11/2010 13:44:10  101       AB
3    17/11/2010 12:45:22  102       SF      *
4    17/11/2010 12:44:10  102       SF
5    17/11/2010 11:45:22  103       RD      *
6    17/11/2010 11:44:10  103       RD        

На основании вышеуказанного набора данных, как я могу удалить дубликаты Emp ID и сохранить только идентификаторы Emp, которые имеют максимальную дату / времяуказано?

Итак, исходя из вышесказанного, я бы видел только идентификаторы: 1, 3 и 5.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 16 ноября 2010

Что-то вроде:

DELETE FROM the_table_with_no_name 
WHERE date_column != (SELECT MAX(t2.date_column) 
                      FROM the_table_with_no_name t2 
                      WHERE t2.id = the_table_with_no_name.id);
1 голос
/ 16 ноября 2010

Вы можете сгенерировать ROWID всех строк, кроме строки с максимальной датой (для заданных EMPIds), и удалить их. Я обнаружил, что это эффективно, так как это подход, основанный на множествах, и используется аналитика, rowID.

--get list of all the rows to be deleted.

select row_id from (
select rowid row_id,
       row_number() over (partition by emp_id order by date desc) rn
  from <table_name>
) where rn <> 1

А затем удалите строки.

delete from table_name where rowid in (
    select row_id from (
    select rowid row_id,
           row_number() over (partition by emp_id order by date desc) rn
      from <table_name>
    ) where rn <> 1
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...