EDITEDの質問に答える(つまり、関連する列も取得する)。
Sql Server 2005以降では、ランキング/ウィンドウを使用するのが最善の方法です。機能 CTE と組み合わせて 、このように:
with exam_data as
(
select r.student_id, r.score, r.date,
row_number() over(partition by r.student_id order by r.score desc) as rn
from exam_results r
)
select s.name, d.score, d.date, d.student_id
from students s
join exam_data d
on s.id = d.student_id
where d.rn = 1;
ANSI-SQL準拠のソリューションの場合、サブクエリと自己結合は次のように機能します。
select s.name, r.student_id, r.score, r.date
from (
select r.student_id, max(r.score) as max_score
from exam_results r
group by r.student_id
) d
join exam_results r
on r.student_id = d.student_id
and r.score = d.max_score
join students s
on s.id = r.student_id;
この最後の例では、student_id / max_scoreの組み合わせが重複していないことを前提としています。重複がない場合や、重複を排除する予定がある場合は、別のサブクエリを使用して、プルするレコードを決定するための決定論的なものに参加する必要があります。 。たとえば、同じ日付の特定の学生に対して複数のレコードを作成できないと仮定して、最新のmax_scoreに基づいてタイを解除したい場合は、次のようにします。
select s.name, r3.student_id, r3.score, r3.date, r3.other_column_a, ...
from (
select r2.student_id, r2.score as max_score, max(r2.date) as max_score_max_date
from (
select r1.student_id, max(r1.score) as max_score
from exam_results r1
group by r1.student_id
) d
join exam_results r2
on r2.student_id = d.student_id
and r2.score = d.max_score
group by r2.student_id, r2.score
) r
join exam_results r3
on r3.student_id = r.student_id
and r3.score = r.max_score
and r3.date = r.max_score_max_date
join students s
on s.id = r3.student_id;
編集:コメントでのマークの良いキャッチのおかげで、適切な重複排除クエリを追加しました