我怎样才能为每个外键

问题描述:

考虑下面的表中的最小值:我怎样才能为每个外键

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

什么是让每一个学生的最小标记的最佳方式? (结果应该是[3,2])

使用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

如果您需要将该规则作为输出的一部分,则以下操作可能比使用子选择稍快(因为只需对表进行一次扫描就可以),但它可能只会显示较大的表。

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的第一声明是要走的路。