Consider below option
select user, actions.action_sequence, flag from (
select *, (
select as struct count(1) actions_count,
string_agg(action, ' >> ' order by sequence) action_sequence
from unnest(arr)
) actions
from (
select *, array_agg(struct(action, sequence))
over(partition by user order by sequence desc range between current row and 1 following) arr
from src_table
)
)
where flag != ''
and actions.actions_count = 2
# order by user, sequence
if applied to sample data in your question - output is

Note - above solution is reusable for any numbers of sequences you want to analyze - unlike the solutions in other answers which are locked to just two
In this solution - you can just change numbers (1 and 2 respectively) in below lines to whatever you need and no other changes will be required :o)
over(partition by user order by sequence desc range between current row and 1 following) arr
and
and actions.actions_count = 2
For example if you change those to respectively 2 and 3 - output will be
