有2个TABLE(TABLEA,TABLEB)  TABLEA里面有A,B,C 3列 TABLEB里面有E,F两列  TABLEA.A=TABLEB.E
得到:关于B,C,F分组后得到最大的20笔A
请问SQL怎么下

解决方案 »

  1.   


    --lz试下,我没试
    select a from(
    (select a,row_number() over(partition by b,c,f order by a desc) rn from
    (select a,b,c,e,f from tableA,tableB where TABLEA.A=TABLEB.E)))
    where rn<=20;
      

  2.   


    --上面代码可简化下
    select a
      from ((select a,
                    b,
                    c,
                    e,
                    f,
                    row_number() over(partition by b, c, f order by a desc) rn
               from tableA, tableB
              where TABLEA.A = TABLEB.E))
     where rn <= 20;
      

  3.   

    row_number()?
    是RANK()吗?
    我不熟悉这个函数,不知道是否:rank() over(partition by b, c, f order by a desc) rn  会对b、c、f进行分组之后的结果,每组根据A的DESC排序?
      

  4.   

    用row_number()和rank()在排序关键字不唯一的情况下,结果是不一样的.
    row_number()为每一个排序关键字在组内返回唯一值.
    而rank()则会出现相同排名的结果.且,所有返回序号并不连续
    DENSE_RANK()和rank()类似,不过其序号保持连续.
    是否需要为相同关键字得到同样的排序位置,就取决于业务需求了.
      

  5.   

    我知道怎么写了,也知道row_number()和rank()的区别了,我想再问下,纯粹用ORDER BY 和GROUP BY能实现吗?
      

  6.   

    用group by的话可能需要结合子查询.
      

  7.   

    是要子查询,但是可以用MAX()什么的找到每组中最大的一个,难结合ORDER BY,ROWNUM把最大的20弄出来...