4

次の表を考えます。

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

各生徒の最低点を取得するための最良の方法は何ですか? (結果は [3,2] である必要があります)

4

2 に答える 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

これにより、生徒の評価が最も低い結果が表示されます。複数の科目で最低点が同じ学生の場合、これは 2 つの行を返すことに注意してください。これを避けるためMINに、分野とGROUP BY学生とマークの周りに別の追加を行うことができます。

于 2012-04-08T13:43:00.760 に答える
4

出力の一部として規律が必要な場合は、サブセレクトを使用するよりも次のほうがわずかに高速になる可能性があります (テーブルを 1 回スキャンするだけでよいため) が、おそらく大きなテーブルの場合にのみ表示されます。

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

生徒ごとに常に 1 つの行が返されます。同じマークの分野が 2 つある場合、どちらが取られるかは定義されていません。

最低のマークが複数回発生した場合に複数の行を返したい場合は、これを使用できます。

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 の最初のステートメントが最適です。

于 2012-04-08T13:56:22.443 に答える