Вот до чего дошел я:
Код:
SELECT s.stud_id stud_id, cath_id, avgm FROM student s,
(SELECT stud_id, AVG(mark) avgm FROM exam_marks GROUP BY stud_id) a
WHERE s.stud_id = a.stud_id;
При этом получается таблица из трех полей: номер группы (cath_id), идентификатор студента (stud_id) и его средний балл (avgm). В принципе можно найти MAX(avgm), сгруппировав по полю cath_id, но при этом теряется поле stud_id - выбирать можно только те поля, которые переписаны в GROUP BY или являются аргументами агрегирующих функций; если же в GROUP BY добавить и это поле (т.е. группировать по cath_id и stud_id), то смысл поиска MAX теряется - строки группируются по одной (очевидно - не может быть двух строк с одинаковыми обоими полями и stud_id, и cath_id). Надо еще подумать... Но, может, дальше и сам до чего-недь додумаешься?...
З.Ы. Кстати, на чем пишешь? Если на Oracle (как и я), то может стоит заколбасить процедурку на PL/SQL?