Похоже на кумулятивную сумму:
select t.*,
(case when flag = 1
then sum(flag) over (partition by name order by date)
end) as cycle_start
from t;
Предполагается, что флаг принимает только значения 0
и 1
, как в данных примера. Его можно легко изменить, если флаг принимает другие значения, отличные от 0
.
РЕДАКТИРОВАТЬ:
Исходя из вашего комментария, я неправильно понял проблему. Вы хотите идентифицировать смежные «группы» записей. Для этого определите группу, используя количество предыдущих значений NULL
, а затем сделайте кумулятивную сумму:
select t.*,
(case when flag = 1
then dense_rank() over (partition by name order by grp)
end) as cycle_start
from (select t.*,
sum(1 - flag) over (partition by name order by date) as grp
from t
) t