表 A 中3个栏位
e_name  机器名字
st   机器状态 Y,N
times  机器切换状态的时间E_NAME       ST                   TIMES
A1                 Y           2009-11-11 11:11:11
A1                 Y           2009-11-12 11:11:11
A1                 Y           2009-11-13 11:11:11
A1                 Y           2009-11-14 11:11:11
A2                 Y           2009-11-15 11:11:11
A2                 Y           2009-11-01 11:11:11
A2                 Y           2009-11-12 11:11:11
A2                 Y           2009-11-09 11:11:11
希望得到每个机器最近的3笔资料。
不要用一下写法
select e_name,st ,times from(select * from a order by times desc) where rownum<4
表数据很数千万条。

解决方案 »

  1.   

    select * 
    from (select e_name,row_number()over (patition by e_name order by times desc as rn 
    from table_name)
    where rn<4
    试试,看效率会好点不 
      

  2.   

    SQL> select * from a;E_NAME     ST         TIMES
    ---------- ---------- ---------------
    A1         Y          21-DEC-09
    A1         Y          20-DEC-09
    A1         Y          19-DEC-09
    A1         Y          18-DEC-09
    A2         Y          17-DEC-09
    A2         Y          16-DEC-09
    A2         Y          15-DEC-09
    A2         Y          14-DEC-098 rows selected.
    SQL> select e_name,st,times from
      2  (
      3  select a.*,
      4  row_number() over(partition by e_name order by times desc) rn
      5  from a
      6  )
      7  where rn<4;E_NAME     ST         TIMES
    ---------- ---------- ---------------
    A1         Y          21-DEC-09
    A1         Y          20-DEC-09
    A1         Y          19-DEC-09
    A2         Y          17-DEC-09
    A2         Y          16-DEC-09
    A2         Y          15-DEC-096 rows selected.
      

  3.   

    还有
    楼主给出的那个sql好像不太准确
    并不能完成你的要求
      

  4.   

    用row_number() over( partition by name order by time) 分析函数来做可能快点。楼主的sql有问题,只会查3条记录出来