Предполагая, что у вас есть -1
с, вы можете сгруппировать их, посчитав следующие 0
с. Затем их можно перечислить, используя dense_rank()
:
select id, rnk
from (select t.*, dense_rank() over (partition by grp) as rnk
from (select t.*,
count(*) filter (where amount = 0) over (order by id desc) as grp
from t
) t
) t
where amount = -1 and rnk = 1
order by id
fetch first 1 row only;
Чтобы обработать ваш первый случай, вы можете объединить запрос следующим образом:
select id, rnk
from t
where not exists (select 1 from t where amount = -1)
order by id
fetch first 1 row only