Аналитическая функция ROW_NUMBER
может использоваться для группировки строк по S_NAME
(если вы хотите получить максимальную оценку для каждого учащегося) и сортировки отметок в порядке убывания, так что максимальное значение поднимается к вершине (то есть получает номер строки = 1).
Затем выберите строки с этим значением номера строки.
SQL> with test (s_id, s_name, subject, mark_value) as
2 (select 1, 'stud', 'sub_1' , 50 from dual union all
3 select 2, 'stud', 'sub_2' , 60 from dual union all
4 select 3, 'stud', 'sub_3' , 70 from dual union all
5 select 4, 'stud_1', 'sub_1', 40 from dual union all
6 select 5, 'stud_1', 'sub_2', 50 from dual union all
7 select 6, 'stud_2', 'sub_2', 40 from dual
8 )
9 select s_id, s_name, subject, mark_value
10 from (select s_id, s_name, subject, mark_value,
11 row_Number() over (partition by s_name order by mark_value desc) rn
12 from test
13 )
14 where rn = 1;
S_ID S_NAME SUBJE MARK_VALUE
---------- ------ ----- ----------
3 stud sub_3 70
5 stud_1 sub_2 50
6 stud_2 sub_2 40
SQL>
если ваша версия базы данных не поддерживает аналитические функции, есть еще один вариант, который не так хорош, поскольку он выбирает из одной таблицы дважды. Вы не заметите разницы, если в таблице не так много строк, но при работе с большими наборами данных пострадает производительность.
<snip>
9 select s_id, s_name, subject, mark_value
10 from test
11 where (s_name, mark_value) in (select s_name, max(mark_value) max_mark
12 from test
13 group by s_name);
S_ID S_NAME SUBJE MARK_VALUE
---------- ------ ----- ----------
3 stud sub_3 70
5 stud_1 sub_2 50
6 stud_2 sub_2 40
SQL>