Вы можете немного разбить это на части.
1- Рассчитать столбец для идентификатора строки [ROW]
RowId()
2- Рассчитать столбец, чтобы определить, находится ли данная строка вгруппа из 0 (текущая строка = 0 и предыдущая или следующая строка = 0) [IN GROUP?]
case when ([A]=0) and ((First([A]) OVER (Previous([ROW]))=0) or (First([A]) OVER (next([ROW]))=0)) then True ELSE False END
3- Вычислить столбец, в котором в совокупности подсчитываются строки, не входящие в группы [#NotInGroup]
Count(If(not [IN GROUP?],1)) OVER (AllPrevious([ROW]))
4- Вычислите свой [B] столбец по рейтингу [#NotInGroup], где [IN GROUP?] = TRUE
case when [IN GROUP?] then DenseRank([#NotInGroup]) end