Это проблема с промежутками и островками, когда вы хотите сгруппировать вместе «соседние» строки.
Здесь я думаю, что самый простой подход - использовать разницу между номерами строк для определения групп:
select client_id, event, count(*) cnt, min(time) start_time, max(time) end_time
from (
select
t.*,
row_number() over(partition by client_id order by time) rn1,
row_number() over(partition by client_id, event order by time) rn2
from mytable t
) t
group by client_id, event, rn1 - rn2
order by client_id, min(time)
Демонстрация на DB Fiddle :
client_id | event | cnt | start_time | end_time
:-------- | :---------- | --: | :--------- | :-------
A | view | 3 | 12:00:00 | 12:05:00
A | purchase | 1 | 14:02:00 | 14:02:00
B | view | 3 | 12:04:00 | 13:20:00
C | view | 2 | 12:00:00 | 12:07:00
C | add_to_cart | 1 | 14:02:00 | 14:02:00
C | view | 1 | 14:19:00 | 14:19:00
C | purchase | 1 | 14:32:00 | 14:32:00
C | view | 1 | 15:32:00 | 15:32:00