Puoi avvicinarti a questo usando row_number() :
select key, val
from (select t.*, row_number() over (partition by key order by num desc) as seqnum
from table_name t
) t
where seqnum = 1;
Se lo consideri più "elegante" è probabilmente una questione di gusti.
Vorrei sottolineare che questo è leggermente diverso dalla tua domanda. Questo è garantito per restituire una riga per ogni key; il tuo potrebbe restituire più righe. Se vuoi quel comportamento, usa semplicemente rank() o dense_rank() invece di row_number() .