从表中删除按两列排序的记录

时间:2014-01-29 05:19:27

标签: sql oracle

我有一个包含这些列的表:

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);

2 个答案:

答案 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
        )
    );
相关问题