有如下table
InsertDate   Num Lv
2007/04/02  1    1
2007/04/02  2    1
2007/01/01  3    1
2007/02/01  6    1
2007/01/01  2    2
要求的是相同Class中InsertDate最近的Num最大的值。
上面的数据的话,结果应该是
2007/04/02  2   1
我的意见是使用rank函数
select * from (select insertdate,num,lv,rank(...) aRank ) where aRank =1...
同事的意见是使用Max函数
select ..,InserDate,Max(Num),lv from tb where InsertDate =(select max(insertDate) from tb group by lv ) from tb group by lv,insertdate
他说如果数据多的时候,我的SQL会慢,我觉得正好相反。
那位大侠评判一下,那个会快些。然后还请帮忙想个效率更高的方法。

解决方案 »

  1.   

    ps,上面写的sql只是为了表达那个意思,错误很多,请见谅。
      

  2.   

    select r,a.InsertDate,max(a.Num),a.Lv from (select rownum r,* from (select InsertDate,Num,Lv from table order by InsertDate desc)) a 
    where r <2;试试看
      

  3.   

    你说这个能对lv进行group处理么?
      

  4.   

    select a.InsertDate,a.Num,a.Lv from (select rownum r,InsertDate,Num,Lv from (select InsertDate,max(Num) num,Lv from test_000 group by InsertDate,Lv  order by InsertDate desc)) a
    where r <2INSERTDATE         NUM      LV
    ----------- ---------- -------
    4/2/2007             2       1
      

  5.   

    SQL> select * from test_000;INSERTDATE          NUM      LV
    ----------- ----------- -------
    4/2/2007              1       1
    4/2/2007              2       1
    1/1/2007              1       1
    2/1/2007              6       1
    1/1/2007              2       2lz看看符合你的要求不?
      

  6.   

    Sorry,我弄错了一个条件,得到的结果应该是按照LV的值分组的。
    以目前的数据结果应该是两条。
    ERTDATE         NUM      LV
    ----------- ---------- -------
    4/2/2007             2       1
    /1/2007              2       2
      

  7.   

    lz这个说法有矛盾:
    对LV分组,再求同ERTDATE中NUM最大的值,那么:
    2007/01/01  3    12007/01/01  2    2分属两组,但又同ERTDATE,那以哪种标准区分其最大?
      

  8.   

    我想楼主的意思是取最接近的日期
    2中方法
    1:rownum=1 order by insertdate
    2: insertdate=(select max(insertdate) from **)
    数据多的时候哪种快?我现在的工作也有这种问题,以前的人用的方法2(存储过程里面),我也不知道哪种快!
    楼下的继续!
      

  9.   

    你在oracle中看一下执行计划不就比较出来,那一个效率更高了
      

  10.   

    多搞点数据,去PLSQL试试看 那个时间短
      

  11.   

    select Num,lv InsertDate,max(num) over (partition by lv order by InsertDate desc) maxNum from tablename order by insertDate Desc
      

  12.   

    HelloWorld_001 说的就是我的意思。
    不知道谁有答案没有。