解决方案 »

  1.   


    with tb_test as(
    select 2 "年级"  ,1 "班级"  ,'英语' "科目"  ,'王五'  "姓名" ,88  "分数" from dual union 
    select 2          ,1         ,'数学'        ,'麻六'        ,79         from dual union 
    select 2          ,2         ,'英语'        ,'小七'        ,69         from dual union 
    select 3          ,1         ,'英文'        ,'蕫永'        ,92         from dual union 
    select 3          ,4         ,'语文'        ,'牛群'        ,84         from dual union 
    select 3          ,4         ,'语文'        ,'蕫永'        ,91         from dual        
    )
    select   "年级","班级","科目","姓名","分数"
    from 
    (
    select t.*,rank() over(partition by  "年级" ,"班级" ,"科目" order by "分数" desc ) rnk 
     from tb_test t
    ) t_1
    where rnk = 1
      

  2.   

    我想进一步问:
    如果两个第二名时接下来就是第四名还是第三名?如果是前者、1楼的rank() over()可以、如果是后者请用dense_rank()over()
      

  3.   

    如2#哥们所言.使用分析函数是查询第几名的最好选择,Oracle对其进行了性能的优化,想必要比一般情况下自己写的sql占有更大的优势.根据不同的需求来写不同的sql:  如果第一名并列的情况,是生成2个或者以上第一名结果,还是第一名只有一个.Oracle分别提供了不同的分析函数来支持.
      

  4.   

    使用了较笨重的方法 你看看是否满足你的需求
    CREATE TABLE chengji
    (
    nianji NUMBER(2),
    banji  NUMBER(2),
    kemu  VARCHAR2(5),
    xingming VARCHAR2(10),
    fenshu  NUMBER(2)
    )insert INTO chengji values(2,1,'英语','王五',88);
    insert INTO chengji values(2,1,'数学','麻6',79);
    insert INTO chengji values(2,2,'英语','小7',69);
    insert INTO chengji values(3,1,'英语','蕫永',92);
    insert INTO chengji values(3,4,'语文','牛群',84);
    insert INTO chengji values(3,4,'语文','蕫永',91);SELECT * FROM chengjiSELECT xingming FROM chengji WHERE fenshu IN(SELECT MAX(fenshu) FROM chengji GROUP BY nianji,banji,kemu) 
      

  5.   

    三个函数间区别 http://blog.csdn.net/loeley/article/details/6928978
      

  6.   

    select t.* from t
    where t.分数=
    (select max(分数) from t1 where t.年级=t1.年级
    and t.班级=t1.班级)
      

  7.   

    用户分组查询的办法:
    select 年级,班级,科目,姓名,分数 from
    chengji a,(select 年级,班级,科目,max(分数) from chengji group by 年级,班级,科目) b 
    where a.年级=b.年级 and a.班级=b.班级 and a.科目=b.科目 and a.分数=b.分数;
    这样可以同时查出班级中有并列最高分的学生姓名。
      

  8.   

    --条件:按年级 班级显示各个科目最高分的并显示姓名select * from tab_name where (年级、班级、分数)
    in
    (select 年级,班级,max(分数) from tab_name);