我有一个mysql表
表名'结果'
Reg.No SubjectCode Attempt Grade Marks
112108 CMIS 1113 1 D 17
112110 CMIS 1114 1 A 85
112119 CMIS 1114 1 D 18
112108 CMIS 1113 2 D+ 25
112110 CMIS 1113 1 D+ 25
112107 CMIS 1113 1 B 70
112108 CMIS 1113 3 C 40
112110 CMIS 1113 2 C 40
112119 CMIS 1114 2 C 42
112120 CMIS 1114 1 D 17
这是关于学生的成绩。
学生至少需要一个“C”
(分数>40) 以通过该科目。
直到通过,学生可以拥有
几次尝试。
但是从第二次尝试的最高分开始,他们
可以得到的是“C”
所以没能通过的同学们
第一次尝试,过去常常再试一次,直到他们通过科目
因此对于最终成绩单,每个科目的最高成绩将被考虑在内。(最高成绩由最高分给出)
例如,CMIS 1113 的最高分 112108 是 40。
所以同样我想获得 ecch 科目的学生成绩(但始终会考虑最高分)
其实我的预期结果表应该是这样的
Reg.No SubjectCode Attempt Grade Marks
112110 CMIS 1114 1 A 85
112107 CMIS 1113 1 B 70
112108 CMIS 1113 3 C 40
112110 CMIS 1113 2 C 40
112119 CMIS 1114 2 C 42
112120 CMIS 1114 1 D 17
那么如何使用sql查询来检索这些数据呢?
最佳答案
要为每个学生只获取一个值,您可以按 Reg.No 和 SubjectCode 分组,然后获取每个科目的最大值。此查询应该有效:
SELECT
`Reg.No`,
`SubjectCode`,
`Attempt`,
`Grade`,
MAX(`marks`) AS marks
FROM
`results`
GROUP BY
`Reg.No`, `SubjectCode`
为了得到所有的列,你需要两个查询,它们可以和一个子查询放在一起。它看起来像这样:
SELECT *
FROM
(SELECT *
FROM `results`
ORDER BY `Grade` ASC) AS t
GROUP BY
`Reg.No`, `SubjectCode`
ORDER BY
`Grade` ASC
“内部查询”将获取所有结果并按 Grade
列从低到高对行进行排序。 “外部查询”将不仅仅是对它们进行分组(不使用 MAX
函数)。这将只产生每个分组的最后一行,而不是最大结果(正如我们在“内部查询”中那样排序的)。
关于mysql - 按最高分筛选学生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27666542/