表结构大致如下:
ID  NAME  INSERT_TIME
1   A1    10:01
2   A1    10:02
3   A2    11:01
4   A2    09:02现在的需求是要根据插入的时间查询出所有name最新的数据例如对于上面的数据,查询出来的结果应该是 ID为2和3的记录。大家帮忙看看这个sql该如何写?

解决方案 »

  1.   

    select id,name,insert_time 
    from tb 
    where 
    insert_time=(select top 2 max(insert_time) from tb 
    order by insert_time desc )
      

  2.   


    select * from table where (name,insert_time) in 
    (select name,max(insert_time) insert_time from table group by name)
      

  3.   


    ls 是不是把我的问题看错了? 你写的sql不符合要求,因为如果有多个name的时间相同的话,取出来的数据就不正确。
    这个sql应该有一个group by的。
      

  4.   

    with t as
    (
        select 1 as id, 'A1' as name, '10:01' as insert_time from dual
         union all
        select 2 as id, 'A1' as name, '10:02' as insert_time from dual
         union all
        select 3 as id, 'A2' as name, '11:01' as insert_time from dual
         union all
        select 4 as id, 'A2' as name, '09:02' as insert_time from dual
    )
    select * from t 
     where (name, insert_time) in (select name, max(insert_time) from t group by name)
     order by id;        ID NAME INSERT_TIME
    ---------- ---- -----------
             2 A1   10:02
             3 A2   11:01
      

  5.   


    可以查询出正确的数据。 但是能否使用id来作为in的条件,因为数据表中的数据量很大,如果使用这个写法性能会比较差。
      

  6.   


    --你可以建一个name,insert_time的复合索引
    --如果一定要使用id的话,试下下面这个,效率不知道,可以试试
    select * 
    from table 
    where id in 
    (
      select a.id 
      from table a 
      where a.insert_time = 
           (select max(b.insert_time) from table b where b.name=a.name)
    )
      

  7.   


    SELECT ID, NAME, INSERT_TIME
      FROM Tb A
     WHERE INSERT_TIME >= ALL (SELECT INSERT_TIME FROM Tb WHERE NAME = A.NAME);
      

  8.   

    select test.id,test.name,test.insert_time from test,(
    select name,max(test.insert_time) time from test group by name) test2
    where test.name=test2.name and test.insert_time = test2.time