如题,表为EMP(ename,sal,score)
将各个职位成绩前3位的职员的姓名,工资,成绩,名次存到一个数据表GOOD中。不知道在group by 和Order by之后怎么选取每一类的前三个啊?
rownum貌似不对啊。

解决方案 »

  1.   

    insert into good
    select * from (
    select * row_number() over(partition by 职位 order by score desc) sc_order from emp
    )
    where sc_order <= 3
      

  2.   

    + 2楼  分析函数如果考虑并列前三名的情况,需要使用DENSE_RANK() OVER(PARTITION BY XXX)
      

  3.   

    如果前三名score并列的话,按理说应该按名字排列吧,多加一个order by ename就是喽
      

  4.   

    不管是用分析函数还是group by 函数,都必须先依据每个职位选出成绩前3名的员工id,再依据选出来的员工id来匹配员工的姓名,工资,成绩。
      

  5.   

    就是这样 不过都有点小问题, 不用row_number() 或者 DENSE_RANK() 要用 rank()
      row_number() 是没有重复值的排序(即使两天记录相等也是不重复的),可以利用它来实现分页
        dense_rank() 是连续排序,两个第二名仍然跟着第三名
        rank()       是跳跃拍学,两个第二名下来就是第四名
      

  6.   

    insert into good
    select * from (
    select rank() over(partition by 职位 order by score desc) sc_order from emp
    )
    where sc_order <= 3
      

  7.   

    select * from (
    select ename 姓名,sal 工资,rank() over(partition by 职位 order by score desc) 成绩 from emp
    )
    where 成绩 <= 3