一道数据库题(写出SQL语句):
成绩表中有三列:学生名,课程名,成绩,该表记录了30名学生的5门课程的成绩,下面有两道题:
1、查询出该表中所有课程的前三名(包含并列的),提示:可不只有三人啊~~2、查询出该表中总成绩的前三名(包含并列的)

解决方案 »

  1.   

    告诉你,用dense_rank()
    这个分析函数
    余下的自己GOOGLE下学得快,否则别人写好的,你也不知道为什么要用这个
      

  2.   

    别逗了,LZ可能试过了,真的不会。
    第一道题给你做了,第二题自已来吧。SQL> select * from student;NAME     CLASS                   SCORE
    -------- ------------------ ----------
    张三     操作系统                   88
    李四     操作系统                   90
    王五     操作系统                   98
    赵六     操作系统                   88
    孙七     操作系统                   60
    孙七     数据结构                   90
    赵六     数据结构                   88
    张三     数据结构                   88
    李四     数据结构                   93
    周二     数据结构                   6610 rows selectedSQL> 
    SQL> select name, class, score, rk
      2    from (select class,
      3                 name,
      4                 score,
      5                 rank() over(partition by class order by score desc) rk
      6            from student
      7           order by score desc)
      8   where rk <= 3
      9   order by class;NAME     CLASS                   SCORE         RK
    -------- ------------------ ---------- ----------
    王五     操作系统                   98          1
    李四     操作系统                   90          2
    赵六     操作系统                   88          3
    张三     操作系统                   88          3
    李四     数据结构                   93          1
    孙七     数据结构                   90          2
    赵六     数据结构                   88          3
    张三     数据结构                   88          38 rows selectedSQL> 
      

  3.   

    我来赚分哈
    1、
    select 学生名, 课程名, 成绩
      from (select 学生名,
                   课程名,
                   成绩,
                   row_number() over(partition by 课程名 order by 成绩) rn
              from student)
     where rn <= 3;
    2、select 学生名, 总成绩
      from (select 学生名, 总成绩, rank() over(order by 总成绩) rk
              from (select 学生名, sum(成绩) 总成绩 from student group by 学生名))
     where rk <= 3
      

  4.   

    试试下面的:
    SELECT 学生名, 课程名, 成绩
      FROM (SELECT 学生名,
                   课程名,
                   成绩,
                   RANK() OVER(PARTITION BY 课程名 ORDER BY 成绩 DESC) RN
              FROM YOURTABLE)
     WHERE RN <= 3;
     
     SELECT 学生名, SS 总成绩
       FROM (SELECT 学生名, SS, RANK() OVER(ORDER BY SS DESC) RS
               FROM (SELECT 学生名, SUM(成绩) SS FROM YOURTABLE GROUP BY 学生名))
      WHERE RS <= 3;