Вы ищете максимальный балл для одной строки, поэтому используйте row_number ():
select score, row_id, name
from (select t.*, row_number() over (order by score desc, row_id) rn from t)
where rn = 1
демо
Вы можете использовать rank
и dense_rank
в вашем примере, но они могут возвращать более одной строки, например, когда вы добавляете строку (0.95, 501, 'PQR')
к своим данным.
keep dense_rank
обычно используется, когда искомое значение отличается от критериев поиска, например, если мы ищем зарплату сотрудника, который работает дольше всего:
max(salary) keep (dense_rank first order by sysdate - hiredate desc)
max
в данном случае означает, что если два или более сотрудников работают дольше всех, но количество дней работы у нас точно такое же, как у нас самая высокая зарплата.
max(salary)
keep (dense_rank first order by sysdate - hiredate desc)
over (partition by deptno)
Это то же самое, что и выше, но зарплата наиболее долго работающих сотрудников показана для каждого отдела отдельно. Вы даже можете использовать пустое значение over()
, чтобы показать зарплату дольше всего работающего сотрудника в отдельном столбце, кроме других данных, таких как имя, зарплата, hire_date.