従来の方法は、分析
です。 MAX()
(または他の分析関数):
select *
from ( select s.student_id
, w.last_name
, w.first_name
, s.numeric_grade
, max(s.numeric_grade) over () as numeric_final_grade
from grade s
join section z
on s.section_id = z.section_id
join student w
on s.student_id = w.student_id
where z.course_no = 230
and z.section_id = 100
and s.grade_type_code = 'FI'
)
where numeric_grade = numeric_final_grade
しかし、私はおそらくFIRST を使用したいと思います。 (KEEP)。
select max(s.student_id) keep (dense_rank first order by s.numeric_grade desc) as student_id
, max(w.last_name) keep (dense_rank first order by s.numeric_grade desc) as last_name
, max(w.first_name) keep (dense_rank first order by s.numeric_grade desc) as first_na,e
, max(s.numeric_grade_name) as numeric_final_grade
from grade s
join section z
on s.section_id = z.section_id
join student w
on s.student_id = w.student_id
where z.course_no = 230
and z.section_id = 100
and s.grade_type_code = 'FI'
最初に提案したものに対するこれらのアプローチの両方の利点は、テーブルを1回スキャンするだけであり、テーブルまたはインデックスにもう一度アクセスする必要がないことです。 RobvanWijkのブログ投稿 を強くお勧めします。 2つの違いについて。
追伸これらは異なる結果を返すため、わずかに異なります。分析関数は、2人の学生が同じ最大スコアを持つ重複を維持します(これはあなたの提案も同様に行います)。集計関数は重複を削除し、同点の場合はランダムなレコードを返します。