В настоящее время мы переходим с Google Analytics (Mobile Data) на Firebase.
Данные в базе данных передаются в BigData, и мы используем следующий запрос для определения продолжительности сеанса.
Когда я запускаю отчет об этих сеансах, средняя продолжительность сеанса, сообщаемая через firebase, примерно в 4 раза меньше, чем средняя продолжительность сеанса, сообщаемая Google Analytics.
У меня одна и та же проблема на разных устройствах (android, ios), и я отправляю одни и те же настраиваемые события одновременно в Google Analytics и Firebase
, используя событие session_start или unnest user_propertiesи использовать непосредственно ga_session_number вместо этого дать те же результаты.
with timeline as
(
select
geo.city as geo_city
,device.operating_system as device_category
, user_pseudo_id
, event_name
, event_timestamp
, lag(event_timestamp, 1) over (partition by user_pseudo_id order by event_timestamp) as prev_event_timestamp
from
`projid.analytics_xxx.events_*`
)
, session_timeline as
(
select
event_name
, geo_city
, device_category
, user_pseudo_id
, event_timestamp
, prev_event_timestamp
, case
when
event_timestamp - prev_event_timestamp >= (30*60*1000*1000)
or
prev_event_timestamp is null
then 1
else 0
end as is_new_session_flag
from
timeline
)
, marked_sessions as
(
select
device_category
, geo_city
, user_pseudo_id
, event_timestamp
, prev_event_timestamp
, sum(is_new_session_flag) over (partition by user_pseudo_id order by event_timestamp) AS user_session_id
, min(prev_event_timestamp) over (partition by user_pseudo_id order by event_timestamp) AS first_prev_event_timestamp
from session_timeline
)
, measured_sessions as
(
select
device_category
, geo_city
, user_pseudo_id
, user_session_id
, FORMAT_TIMESTAMP("%F", TIMESTAMP_MICROS(first_prev_event_timestamp)) as first_time_date
, FORMAT_TIMESTAMP("%F", TIMESTAMP_MICROS(min(event_timestamp))) as date
, round((max(event_timestamp) - min(event_timestamp))/ (1000 * 1000), 2) as session_duration_seconds
, round((max(event_timestamp) - min(event_timestamp))/ (1000 * 1000 * 60), 2) as session_duration_minutes
, round((max(event_timestamp) - min(event_timestamp))/ (1000 * 1000 * 60 * 60), 2) as session_duration_hours
from
marked_sessions
group by
user_pseudo_id
, user_session_id
, device_category
, geo_city
, first_prev_event_timestamp
having
-- let's count only sessions longer than 10 seconds
session_duration_seconds >= 10
)
select
*
from
measured_sessions
order by date desc, user_pseudo_id desc, user_session_id desc
не только значительно отличается средняя продолжительность сеанса, но даже количество сеансов далеко от нормы.