如何获得每个外键的最小值

时间:2012-04-08 13:41:57

标签: sql database postgresql

鉴于下表:

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

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

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的第一个陈述是要走的路。