Możesz podejść do tego za pomocą 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;
To, czy uważasz to za bardziej „eleganckie”, jest prawdopodobnie kwestią gustu.
Powinienem zaznaczyć, że jest to nieco inne niż twoje zapytanie. To gwarantuje zwrócenie jednego wiersza dla każdego key; Twój może zwrócić wiele wierszy. Jeśli chcesz tego zachowania, po prostu użyj rank() lub dense_rank() zamiast row_number() .