Вам необходимо присвоить группу «смежным» значениям. Одним простым методом является разность номеров строк:
select a, b,
row_number() over (partition by b, (seqnum_a - seqnum_ab) order by a) as d
from (select t.*,
row_number() over (order by a) as seqnum_a,
row_number() over (partition by b order by a) as seqnum_ab
from t
) t;
Разница номеров строк - это одно из решений некоторых типов проблем с пробелами и островками (в основном то, что вы просите). Почему это работает, немного сложно объяснить. Я обнаружил, что если кто-то увидит результаты подзапроса, он, как правило, поймет, почему разница определяет соседние строки.