续上一篇总结:
3.6 查询各科名次(分区),排名前两位的信息,如:新闻表点击率在前两条的新闻或商品销售在前10名的商品等
--6.查询各科名次(分区),排名前两位的信息,如:新闻表点击率在前两条的新闻或商品销售在前10名的商品等
select *
from (select t.s_id 学号,
t.s_name 姓名,
t.sub_name 科目,
t.score 成绩,
dense_rank() over(partition by t.sub_name order by score desc nulls last) 名次
from t_score t) a
where a.名次 <= 2;
查询结果:
学号 | 姓名 | 科目 | 成绩 | 名次 |
4 | 杨过 | JAVA | 90.00 | 1 |
4 | 杨过 | Oracle | 77.00 | 1 |
2 | 李四 | Oracle | 77.00 | 1 |
3 | 张三丰 | Oracle | 0.00 | 2 |
5 | mike | c++ | 80.00 | 1 |
2 | 李四 | 数学 | 80.00 | 1 |
1 | 张三 | 数学 | 0.00 | 2 |
3 | 张三丰 | 体育 | 120.00 | 1 |
1 | 张三 | 语文 | 80.00 | 1 |
2 | 李四 | 语文 | 50.00 | 2 |
3.7 查询各同学总分
--7.查询各同学总分
select t.s_id 学号,
t.s_name 姓名, /*t.sub_name 科目, t.score 成绩, */
sum(nvl(t.score, 0)) 总分
from t_score t
group by t.s_id, t.s_name;
查询结果:
学号 | 姓名 | 总分 |
3 | 张三丰 | 130 |
5 | mike | 80 |
2 | 李四 | 207 |
4 | 杨过 | 167 |
1 | 张三 | 80 |
3.8 查询各同学总分名次
--8.查询各同学总分名次
select a.学号, a.姓名,rank() over(order by a.总分 desc) 名次
from (select t.s_id 学号,
t.s_name 姓名, /*t.sub_name 科目, t.score 成绩, */
sum(nvl(t.score, 0)) 总分
from t_score t
group by t.s_id, t.s_name) a;
查询结果:
学号 | 姓名 | 名次 |
2 | 李四 | 1 |
4 | 杨过 | 2 |
3 | 张三丰 | 3 |
5 | mike | 4 |
1 | 张三 | 4 |