If может помочь, если вы определили CTE только с сеансами, а не на уровне событий.Если это работает:
select session_user_id, sent_at,
row_number() over (order by session_user_id, sent_at) as global_session_id
from materialized_result_of_sessions_2_query
where is_new_session
group by session_user_id, sent_at;
Если это не работает, вы можете создать глобальный идентификатор:
. Вы можете присоединить это обратно к исходным данным уровня события, а затем использовать max()
функция окна, чтобы назначить его всем событиям.Что-то вроде:
select e.*,
max(s.global_session_id) over (partition by e.session_user_id order by e.event_at) as global_session_id
from events e left join
(<above query>) s
on s.session_user_id = e.session_user_id and s.sent_at = e.event_at;
Если нет, вы можете сделать:
select us.*, us.user_session_id + s.offset as global_session_id
from (select session_user_id, sent_at,
row_number() over (partition by session_user_id order by sent_at) as user_session_id
from materialized_result_of_sessions_2_query
where is_new_session
) us join
(select session_user_id, count(*) as cnt,
sum(count(*)) over (order by session_user_id) - count(*) as offset
from materialized_result_of_sessions_2_query
where is_new_session
group by session_user_id
) s
on us.session_user_id = s.session_user_id;
Это может все равно произойти, если почти все пользователи уникальны и сеансы короткие.