2012-04-08 4 views
4

Учитывая следующую таблицу:Как я могу получить минимальное значение для каждого внешнего ключа

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

Что является лучшим способом, чтобы получить минимальную отметку для каждого студента? (результат должен быть [3,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 студент и знак.

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 первый заявление - путь.

Смежные вопросы