Вы можете использовать агрегацию в Oracle:
select max(lvl) as lvl, kid,
max(father) keep (dense_rank first order by lvl desc) as father
from t
group by kid;
Ключевое слово keep
используется (в данном случае) для реализации функции агрегирования «первое значение».На практике я считаю, что это работает очень эффективно.
Конечно, вы можете сравнить его с другими методами, такими как:
select t.*
from t
where t.lvl = (select max(t2.lvl) from t t2 where t2.kid = t.kid);