我有一个包含这些列的表:
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
编辑:
到目前为止,我已尝试过此操作,但它不会删除具有相同日期但时间不同的记录:
delete from table where (tel_number,date) not in
(select tel_number,max(date) from table group by tel_number);
答案 0 :(得分: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);
答案 1 :(得分:0)
我用这个查询解决了这个问题:
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
)
);