日期:2014-05-17  浏览次数:20877 次

oracle 查询最高分
年级 班级 科目 姓名  分数
2 1 英语 王五 88
2 1 数学 麻六 79
2 2 英语 小七 69
3 1 英文 蕫永 92
3 4 语文 牛群 84
3 4 语文 蕫永 91



条件:按年级 班级显示各个科目最高分的并显示姓名


------解决方案--------------------

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


------解决方案--------------------
我想进一步问:
如果两个第二名时接下来就是第四名还是第三名?如果是前者、1楼的rank() over()可以、如果是后者请用dense_rank()over()
------解决方案--------------------
如2#哥们所言.

使用分析函数是查询第几名的最好选择,Oracle对其进行了性能的优化,想必要比一般情况下自己写的sql占有更大的优势.

根据不同的需求来写不同的sql:  如果第一名并列的情况,是生成2个或者以上第一名结果,还是第一名只有一个.Oracle分别提供了不同的分析函数来支持.