4

给定下表:

student   discipline   mark
-------   ----------   ----
   1         math       5 
   1      phylosophy    4
   1      literature    3
   2         math       2
   2      phylosophy    5
   2      literature    5

为每个学生获得最低分数的最佳方法是什么?(结果应该是 [3,2])

4

2 回答 2

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学生和标记周围添加另一个。

于 2012-04-08T13:43:00.760 回答
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 的第一句话就是要走的路。

于 2012-04-08T13:56:22.443 回答