一个学生表  学号 姓名 班级 成绩
   01  张三  1    90
   02  李四  2    80
   03  王五  1    91
   04  赵六  1    86
   05  孙七  2    88
   06  王八  2    60
我想先按照班级分组,在按照成绩取出前二名学生,得到以下结果:
  学号 姓名 班级 成绩
   03  王五  1    91
   01  张三  1    90
   02  李四  2    80
   05  孙七  2    88谢谢!

解决方案 »

  1.   


    SELECT 学号, 姓名, 班级, 成绩
      FROM (SELECT 学号,
                   姓名,
                   班级,
                   成绩,
                   DENSE_RANK() OVER(PARTITION BY 班级 ORDER BY 成绩 DESC) ROW_
              FROM TABLE_NAME)
     WHERE ROW_ <= 2;
      

  2.   


    --简单写了下,应该还有更简单的写法
    create table cc_a(no varchar2(10),name varchar2(20),class number, grade number); 
    SELECT t1.no, t1.NAME, t1.CLASS, t1.grade
    FROM (SELECT t.no, t.NAME, t.CLASS, t.grade
     FROM cc_a t
    WHERE CLASS = 1
    AND rownum < 3
    ORDER BY grade DESC) t1
    UNION ALL
    SELECT t2.no, t2.NAME, t2.CLASS, t2.grade
    FROM (SELECT t.no, t.NAME, t.CLASS, t.grade
     FROM cc_a t
    WHERE CLASS = 2
    AND rownum < 3
    ORDER BY grade DESC) t2;--结果
    1 03 王五 1 91
    2 01 张三  1 90
    3 05 孙七 2 88
    4 02 李四 2 80
      

  3.   


    SELECT *
      FROM STU A
     WHERE EXISTS (SELECT * FROM STU WHERE SCORE > A.SCORE HAVING COUNT(1) < 2)
     ORDER BY SCORE DESC;
      

  4.   


     SELECT t.no, t.NAME, t.CLASS, t.grade
     FROM (SELECT t.no, t.NAME, t.CLASS, t.grade,
     DENSE_RANK() OVER(PARTITION BY t.CLASS ORDER BY t.grade DESC) ROW_
    FROM cc_a t) t
    WHERE ROW_ <= 2;
    --very good