Oracle函数Rank Over Partition使用实例详解(二)

续上一篇总结:

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

猜你喜欢

转载自zhaisx.iteye.com/blog/774206