一、题目
现在有“学生成绩表”,记录了学生选修课程的名称以及成绩。 现在需要找出语文课中成绩第n高的学生成绩。如果不存在第n高成绩的学生,那么查询应返回 null。
二、学生成绩表的建立及数据导入
create table student_score(sno varchar(5),cname varchar(10),score int) row format delimited fields terminated by ',';
load data local inpath '/opt/module/data/student_score.txt' into table student_score;
查询学生成绩表
三、回顾limit作用及用法
limit作用:将查询结果集的一部分取出来。通常使用在分页查询当中。 完整用法: limit startIndex, length startIndex是起始下标,length是取的长度。 起始下标从0开始。 如 limit 5,3 是从第六开始取三个,即取排在6到8位的数据
缺省用法:如:limit 5; 这是取前5。
四、查询语文成绩第n高的学生成绩
需求回顾:现在需要找出语文课中成绩第n高的学生成绩。如果不存在第n高成绩的学生,那么查询应返回 null。 如果使用mysql的话是可以使用limit和ifnull来解决该问题的,但是Hive中没有ifnull,在这里我选择使用nvl函数解决了在取不到第n高成绩时取null的要求。
1、查询语文成绩第二名学生的成绩
select distinct nvl(score,null) score
from student_score
where cname='语文'
order by score desc
limit 1,1;
第二名为90分
2、查询数学成绩第五名学生的成绩
select distinct nvl(score,null) score
from student_score
where cname='数学'
order by score desc
limit 4,1;
因为没有数学成绩第五名的学生,所以返回null
五、总结
解决本题要掌握理解limit的作用与用法,便可以灵活应对第n高的这种问题。 Hive中的sql语句语法与mysql有的地方存在差异,需要主要,在本题使用order by时就容易出现问题,相关问题将在以后总结发布。
|