Wenn Sie die Disziplin als Teil der Ausgabe benötigen, ist das Folgende möglicherweise etwas schneller als die Verwendung einer Unterauswahl (weil nur ein einziger Scan über die Tabelle erforderlich ist), aber es wird wahrscheinlich nur für größere Tabellen angezeigt.
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
Es wird immer genau eine Zeile pro Schüler zurückgegeben. Wenn es zwei Disziplinen mit der gleichen Markierung gibt, ist nicht definiert, welche genommen wird.
Wenn Sie mehrere Zeilen zurückgeben wollen, wenn die niedrigste Marke mehr als einmal auftritt, können Sie diese verwenden:
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
Wenn Sie die Disziplin nicht benötigen, sondern nur die niedrigste Marke, dann GavinCattell erste Aussage ist der Weg zu gehen.