Я думаю, что наиболее эффективный запрос - это коррелированный подзапрос с правильным индексом:
select t.*
from t
where t.date = (select max(t2.date)
from t t2
where t2.student = t.student and t2.lesson = t.lesson
);
Требуемый индекс находится на (student, lesson, date)
.
Обратите внимание, что в некоторых базах данных другие методы могут быть немного быстрее. Но, как правило, я считаю, что это имеет хорошие показатели.