分数在一组学生中平均分配

  • 本文关键字:分配 一组 mysql algorithm
  • 更新时间 :
  • 英文 :


我有一个特定学校的学生数据库。

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"组(例如m是250)。这样一组的每个科目都应该有接近平均的分数。以上六名学生的平均数学成绩为59分(只考虑数学)。如果我们把六个学生分成两组,每组三个学生。第一组= {Aakas, Abhi, Geeta}第二组= {Pradip, Nikita, Shanti}

第一组学生数学平均56.67分,接近59分,第二组学生数学平均61.33分,接近59分

这是只考虑数学的情况。我们必须考虑所有科目,使每组的平均分接近全体学生的个别科目平均分。如何解决?

如果你只有一个科目,每组需要2名学生,那么你将得分最高的学生与得分最低的学生配对,得分第二高的学生与得分第二低的学生配对,以此类推,得到一组每对学生的平均值将接近所有学生的平均值的组。

同样,对于250个组,或每组4名学生,您可以对每个学生在所有科目中进行排名,并将排名前2名的学生与排名垫底的2名学生分组,将排名前3和第4名的学生与排名垫底的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

最新更新