2012-04-08 6 views

Antwort

7

Verwenden Sie die MIN-Funktion.

SELECT student, MIN(mark) 
FROM result_table 
GROUP BY student 

Wenn Sie die Disziplin, die sie in ihr die niedrigste Note bekam kann folgendes tun:

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 

Dies wird die Ergebnisse zeigen, wo der Student die niedrigste Note hatte. Beachten Sie, dass dadurch zwei Zeilen für einen Schüler zurückgegeben werden, wenn sie in mehreren Fächern dieselbe niedrigste Marke haben. Um dies zu vermeiden, können Sie eine weitere MIN um die Disziplin und GROUP BY Student und markieren.

4

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.

Verwandte Themen