2014-01-29 2 views
-1

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

tel_number,date,time 

Там может быть несколько записей для одного tel_number. Для каждого tel_number я хочу удалить все, кроме записи, которая имеет самую последнюю дату из таблицы, и в тех случаях, когда есть несколько записей за самую последнюю дату, тот, который в последний раз выбирается, и все остальные следует удалить из таблицы.

, например, из записей, как эти:

1 2223333,14/01/28,08:30 
2 2223333,14/01/27,08:30 
3 2223333,14/01/28,16:30 
4 2225555,14/01/27,10:34 
5 2225555,13/12/29,10:34 

все записи, кроме этих двух должны быть удалены:

3 2223333,14/01/28,16:30 
4 2225555,14/01/27,10:34 

редактировать:

Я попытался это до сих пор, но это Безразлично 't удалять записи, которые имеют ту же дату, но в разное время:

delete from table where (tel_number,date) not in 
(select tel_number,max(date) from table group by tel_number); 
+1

Выделите строки с наибольшими датами, опустошите таблицу и вставьте данные. Это довольно наивный подход, но простой в реализации. –

+1

Можете ли вы поделиться с нами тем, чего вы пытаетесь достичь? –

+0

@Narges Ваш первоначальный подход находится на правильном пути. Подумайте, почему ваш запрос не находит записи с наибольшим значением времени. Вы очень близки и просто должны правильно продлить свою попытку. –

ответ

1

В соответствии с Deleting Duplicate Rows In Oracle:

1. Используя MIN (RowId): Наиболее распространенный способ удаления повторяющихся строк.

DELETE FROM Table1 
     WHERE ROWID NOT IN (SELECT MIN (ROWID) 
           FROM Table1 
          GROUP BY tel_number, Date, Time); 

2. Используя MIN (ROWID) & Регистрация: Более или менее такой же, как первый один

DELETE FROM Table1 t 
     WHERE t.ROWID NOT IN (SELECT MIN (b.ROWID) 
           FROM Table1 b 
          WHERE b.tel_number = t.tel_number 
           AND b.Date = t.Date 
           AND b.Time = t.Time); 

3. Использование функций Аналитические

DELETE FROM Table1 
     WHERE ROWID IN (
       SELECT rid 
       FROM (SELECT ROWID rid, 
           ROW_NUMBER() OVER (PARTITION BY tel_number,Date, Time ORDER BY ROWID) rn 
         FROM Table1) 
       WHERE rn <> 1); 
0

I решил проблему с этим вопросом:

delete from table a where (a.tel_number,a.DATE,a.TIME) not in 
    (
     select tel_number,date,max(time) 
     from table group by tel_number,date 
     having date in 
     (
      select max(date) from table group by tel_number 
     ) 
    ); 
Смежные вопросы