鉴于下表:
student discipline mark
------- ---------- ----
1 math 5
1 phylosophy 4
1 literature 3
2 math 2
2 phylosophy 5
2 literature 5
为每位学生获得最小分数的最佳方法是什么? (结果应为[3,2])
答案 0 :(得分:7)
使用MIN
功能。
SELECT student, MIN(mark)
FROM result_table
GROUP BY student
如果你需要纪律,他们得到最低分,你可以做到以下几点:
SELECT result_table.*
FROM result_table
JOIN (SELECT student, MIN(mark) as min_mark
FROM result_table
GROUP BY student) lowest_result ON result_table.student = lowest_result.student
AND result_table.mark = lowest_result.min_mark
这将显示学生得分最低的结果。请注意,如果学生在多个科目中具有相同的最低分,则会为学生返回两行。为避免这种情况,您可以在学科和MIN
学生周围添加另一个GROUP BY
并标记。
答案 1 :(得分:4)
如果您需要将该规则作为输出的一部分,则以下可能比使用子选择稍快(因为只需要对表进行单次扫描),但它可能仅针对较大的表显示。
select student,
discipline,
mark as lowest_mark
from (
select student,
discipline,
mark,
row_number() over (partition by student order by mark) as rn
from the_table
) t
where rn = 1
每位学生将始终返回一行。如果有两个具有相同标记的学科,则没有定义将采用哪一个。
如果您希望在最低标记出现多次时返回多行,则可以使用:
select student,
discipline,
mark as lowest_mark
from (
select student,
discipline,
mark,
min(mark) over (partition by student) as min_mark
from the_table
) t
where mark = min_mark
如果你不需要纪律,但只需要最低分,那么GavinCattell的第一个陈述是要走的路。