Вы можете сделать это с накопленной суммой.Только для задания:
select t.*,
coalesce(sum(case when event = 'purchase' then 1 else 0 end) over
(order by contact_id, product_code, timestamp desc
rows between unbounded preceding and 1 preceding
), 1) as grp
from t;
Здесь - это дБ <> скрипка.
РЕДАКТИРОВАТЬ:
Я признаю, что просто не понимаю, почемулогика полезна, потому что группы назначаются сначала по продукту, а затем по времени.Очень странно.
Группы назначаются следующим образом:
select t.*,
sum(case when prev_event = 'purchase' or seqnum = 1 then 1 else 0 end) over
(order by contact_id, product_code, timestamp) as grp
from (select t.*,
row_number() over (partition by contact_id, product_code order by timestamp) as seqnum,
lag(event) over (order by contact_id, product_code, timestamp) as prev_event
from t
) t
order by 1, 2, 3;
Вы можете использовать dense_rank()
для назначения нужных последовательных номеров:
select t.*, dense_rank() over (order by _grp) as grp
from (select t.*,
sum(case when prev_event = 'purchase' or seqnum = 1 then 1 else 0 end) over
(order by contact_id, product_code, timestamp) as _grp
from (select t.*,
row_number() over (partition by contact_id, product_code order by timestamp) as seqnum,
lag(event) over (order by contact_id, product_code, timestamp) as prev_event
from t
) t
) t
order by 1, 2, 3;
Здесь - это дБ <> скрипка.