年级 班级 科目 姓名 分数
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分别提供了不同的分析函数来支持.