这里,你可以采取的办法。
关键的想法是统计每个班级的男女学生人数,然后分配他们。如果我们掌握了这些信息,这项任务非常简单。因此,假设我们有它:
with magictable (
<subquery here is nummale and numfemale in each class
),
classinfo (
select mt.*,
sum(nummales) over (partition by grade) - 1 as endrange_male,
sum(nummales) over (partition by grade) - nummales as startrange_male,
sum(numfemales) over (partition by grade) - 1 as endrange_female,
sum(numfemales) over (partition by grade) - numfemales as startrange_female
from magictable mt
)
select
from (select s.*,
ROW_NUMBER() over (partition by grade, gender order by student_id) as seqnum
from student s
) s join
classinfo ci
on (s.gender = 'M' and s.seqnum between startrange_male and endrange_male) or
(s.gender = 'F' and s.seqnum between startrange_female and endrange_female)
所以,这原来分配到信息的计算有多少男性和女性在每个班级。你可能有其他的方法来完成这个,所以我会在这里给出一个近似的答案。
您可以计算每个年级的学生人数,男性人数和女性人数。通过从总容量中减去实际的学生数量来计算“过剩”学生的数量。这给出了每个类的实际大小。然后按男性/女性比例划分。
下面的查询显示如何做到这一点:
select c.*,
(c.class_limit - ((csum.maxcapacity - ssum.numstudents)/csum.numcourses)) as actsize,
(c.class_limit - ((csum.maxcapacity - ssum.numstudents)/csum.numcourses)) * (NumMales/NumStudents) as actMales,
(c.class_limit - ((csum.maxcapacity - ssum.numstudents)/csum.numcourses)) * (NumFemales/NumStudents) as actFemales
from course c join
teacher t
on c.teacher_id = t.teacher_id
(select grade, count(*) as numcourses, SUM(class_limit) as maxcapacity
from course c join
teacher t
on c.teacher_id = t.teacher_id
group by grade
) csum
on t.grade = csum.grade join
(select grade, sum(case when gender = 'M' then 1 else 0 end) as NumMales,
sum(case when gender = 'F' then 1 else 0 end) as NumFemales,
count(*) as NumStudents
from s
group by grade
) ssum
on t.grade = ssum.grade;
的问题是,这是一个近似值,因为它在分数的学生的交易。而且,唉,真正的学生只能以非分数的大小进入。
有一个真正的解决方案来计算离散尺寸。相反,我只是将NumMales和NumFemales四舍五入到下一个整数,并将其用于估算。这对你的目的可能已经足够了。
而且,此解决方案中的代码是为了说明解决方案。它可能有句法问题。
'我需要他们是性别平衡的.. ..但没有你的设置中的性别信息..? –
性别平衡是性别歧视!如果只有我和其他人注册,并与其余的女性说服,我们被迫纯粹基于我们的生殖器进入不同的课程!我反对:P – Wrikken
对不起,忘了添加有一个字段是为M或F的学生 – Mysteri0n