Это в основном задача "найти диагональ". Вам нужно знать ранг B внутри A и ранг A внутри всех. Я считаю, что это работает для приведенных данных:
select A, B from (
select row_number() over (partition by A order by B) as RN,
dense_rank() over (order by A) as DR.
A, B
from <table> )
where RN = DR;
Для более сложных случаев это решение станет более сложным.
Приложение: потому что я знаю, что его спросят, и это интересная проблема , Я придумал, как будет выглядеть такое более сложное решение:
select min(A) as A, B from (
select decode(A <> nvl(min(A) over (order by DRB, DRA rows between unbounded preceding and 1 preceding),-1), true, 'good', 'no good') as Y,
A, B from (
select dense_rank() over (partition by B order by A) as DRA,
dense_rank() over ( order by B) as DRB,
A, B from <table>
)
where DRA <= DRB
)
where Y = 'good'
group by B
order by A, B;