我有一个特定学校的学生数据库。
student_name |math | science| english| social
---------------------------------------------
Aakas | 80 | 70 | 90 | 55
Aphi | 30 | 80 | 67 | 79
Geeta | 60 | 89 | 95 | 87
pradip | 70 | 78 | 67 | 65
Nikita | 45 | 78 | 90 | 48
Shanti | 69 | 90 | 67 | 84
学生编号 n 是1000。
我需要做的是将学生分成以下几个小时。组(例如m为250)。这样一个群体中的每个主体都应该具有接近平均的分数。对于上述情况,仅考虑数学,数学的平均分数为59(对于给定的六名学生)。如果我们将六名学生分成两组,每组包含3名学生。第1组= {Aakas,Abhi,Geeta}第2组= {Pradip,Nikita,Shanti}
第1组的数学平均值为56.67,接近59组2,数学平均值为61.33,接近59
仅考虑数学就是这种情况。我们必须考虑所有科目,使得每组的平均分数接近整个学生的个别科目的平均分。怎么解决?
答案 0 :(得分:0)
如果你只有一个科目并且每组需要2名学生,那么你将得分最高的学生与得分最低的学生和得分第二高的得分学生分成第二低的得分学生,依此类推得到一组每对的平均值将接近所有学生的平均分数。
同样地,对于每组250个小组或4个学生,您可以对每个学生进行所有科目的排名,并将排名前2位的学生分为排名最低的2名学生和排名第3和排名第4的学生。第四名学生等等。
以下是根据学生的总数学和科学成绩对学生进行排名的查询。您可以调整此查询以包含更多主题。
http://sqlfiddle.com/#!9/a4667/1
select t1.student_name, math, science, math_rank.rn, science_rank.rn,
math_rank.rn + science_rank.rn as total_rank,
@group_number := if(@rn % 4 = 0, @group_number + 1, @group_number) group_number,
@rn := (@rn + 1)
from Table1 t1
join (
select stuadent_name, (@rn_math := @rn_math + 1) rn
from Table1
cross join (select @rn_math := 0) t2
order by math desc
) math_rank on t1.student_name = math_rank.student_name
join (
select student_name, (@rn_science := @rn_science + 1) rn
from Table1
cross join (select @rn_science := 0) t2
order by science desc
) science_rank on t1.student_name = science_rank.student_name
cross join (select @group_number := 1, @rn := 1) t2
order by total_rank