场景:假设有一个表,记录了学生全部科目的成绩,那么如今要取出每一个科目分数最高的2位同窗的考试成绩。
表名为student_grade
表中字段为:
course_id,course_name, student_id, student_name, grademysql
select course_id,course_name, student_id, student_name, grade, row_number() over(partition by course_id order by grade desc) as rank from student_grade where rank <= 2
注:MySQL中不支持使用row_number()函数sql
select * from ( select course_id, course_name, student_id, student_name, grade, (select count(*) from student_grade as t2 where t1.course_id=t2.course_id and t1.grade<=t2.grade) as rank from student_grade as t1) as t3 where rank <=2 order by course_id, rank
在嵌套查询中,利用两个表的course_id字段相等,能够获得这个分组下每条记录在分组中的排名(rank)函数
相应的要获取分组中,前n项的和或者平均值之类的,只须要以查询的结果为一个新的表,在该表上查询相应的聚合值。优化
select sum(grade) from ( select course_id, course_name, student_id, student_name, grade, (select count(*) from student_grade as t2 where t1.course_id=t2.course_id and t1.grade<=t2.grade) as rank from student_grade as t1) as t3 where rank <=2 group by course_id
select *, grade/course_grade_sum as percent from( select course_id, course_name, student_id, student_name, grade, (select sum(grade) from student_grade as t2 where t1.course_id=t2.course_id) as course_grade_sum from student_grade as t1) as b
查询每一个人考试分数最高的科目的记录code
select * from student_grade as t1 where grade = (select max(grade) from student_grade as t2 where t1.student_id=t2.student_id)
select t1.student_id, t1.student_name, t1.course_id, t1.course_name, t1.grade from student_grade as t1 left join student_grade as t2 on t1.student_id= t2.student_id group by t1.student_id,t1.student_name, t1.course_id, t1.course_name, t1.grade having t1.grade=max(t2.grade)
最后的having条件中max(t2.grade)基于的范围是什么?是join的条件么?排序
参考资料:慕课网MySQL开发技巧(一)开发
mysql中,能够利用rand()函数排序,而后取前n条结果get
select * from table1 order by rand() limit n