Where i can find Average Session Duration in Firebase Analytics. How to Extract this Metrics Through Bigquery

老子叫甜甜 提交于 2020-08-10 01:14:52

问题


  1. Where to find Avg. Session Duration Metrics in Firebase analytics?
  2. How to extract Avg. Session Duration Metrics data from Bigquery?

Avg. Session Duration Metrics which was previous available in Firebase analytics dashboard. But now, it is not available in Firebase analytics dashboard. Now, we are only seeing "Engagement Per User". Is the Engagement Per User and Avg. Session Duration Both are same? How to extract Avg. Session Duration from Fiebase analytics? How to query in Bigquery to extract Avg. Session duration metrics from Firebase. enter image description here


回答1:


Engagement per User is not the same as Avg. Session Duration. Engagement per User is all the time a user spends in the app in a day, not in a session.

  1. You can find Avg. Session Duration in Firebase Analytics under Latest Release.

  2. Here is a query for calculating avg. session length in BigQuery:

with timeline as
(
  select 
    user_pseudo_id
    , event_timestamp
    , lag(event_timestamp, 1) over (partition by user_pseudo_id order by event_timestamp) as prev_event_timestamp
  from 
    `YYYYY.analytics_XXXXX.events_*`
  where
    -- at first - a sliding period - how many days in the past we are looking into:
    _table_suffix
           between format_date("%Y%m%d", date_sub(current_date, interval 10 day))
           and     format_date("%Y%m%d", date_sub(current_date, interval 1 day))
) 
, session_timeline as 
(
  select 
    user_pseudo_id
    , event_timestamp
    , case 
        when 
           -- half a hour period - a threshold for a new 'session'
           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 
    user_pseudo_id
    , event_timestamp
    , sum(is_new_session_flag) over (partition by user_pseudo_id order by event_timestamp) AS user_session_id
  from session_timeline
)
, measured_sessions as
(
  select
    user_pseudo_id
    , user_session_id
    -- session duration in seconds with 2 digits after the point
    , round((max(event_timestamp) - min(event_timestamp))/ (1000 * 1000), 2) as session_duration
  from 
    marked_sessions
  group by
    user_pseudo_id
    , user_session_id
  having 
    -- let's count only sessions longer than 10 seconds
    session_duration >= 10
)
select 
  count(1)                          as number_of_sessions
  , round(avg(session_duration), 2) as average_session_duration_in_sec
from 
  measured_sessions

For your additional question on how to get event_date and app_info.id, see the following query:

with timeline as
(
  select 
     event_date,app_info.id,user_pseudo_id
    , event_timestamp
    , lag(event_timestamp, 1) over (partition by user_pseudo_id order by event_timestamp) as prev_event_timestamp
  from 
    `<table>_*`
  where
    -- at first - a sliding period - how many days in the past we are looking into:
    _table_suffix
          between format_date("%Y%m%d", date_sub(current_date, interval 10 day))
          and     format_date("%Y%m%d", date_sub(current_date, interval 1 day))
) 
, session_timeline as 
(
  select 
    event_date,id,
    user_pseudo_id
    , event_timestamp
    , case 
        when 
           -- half a hour period - a threshold for a new 'session'
           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 
     event_date,id, user_pseudo_id
    , event_timestamp
    , sum(is_new_session_flag) over (partition by user_pseudo_id order by event_timestamp) AS user_session_id
  from session_timeline
)
, measured_sessions as
(
  select
     event_date,id, user_pseudo_id
    , user_session_id
    -- session duration in seconds with 2 digits after the point
    , round((max(event_timestamp) - min(event_timestamp))/ (1000 * 1000), 2) as session_duration
  from 
    marked_sessions
  group by
     event_date, id, user_pseudo_id
    , user_session_id
  having 
    -- let's count only sessions longer than 10 seconds
    session_duration >= 10
)
select 
   event_date, id, count(1)                          as number_of_sessions
  , round(avg(session_duration), 2) as average_session_duration_in_sec
from 
  measured_sessions
  group by event_date, id



回答2:


Every session (as defined here since December 2019: https://firebase.googleblog.com/2018/12/new-changes-sessions-user-engagement.html) has a session_id (besides other parameters). I think the safest and most robust way to calculate average session duration is to extract the data to BigQuery and then to calculate the average difference between the first and last timestamp by session. You need to flatten the array of event_params for this. For example, this is how it would be done in AWS Athena:

WITH arrays_flattened AS 
    (SELECT params.key AS key,
         params.value.int_value AS id,
         event_timestamp,
         event_date
    FROM your_database
    CROSS JOIN UNNEST(event_params) AS t(params)
    WHERE params.key = 'ga_session_id'), duration AS 
    (SELECT MAX(event_timestamp)-MIN(event_timestamp) AS duration
    FROM arrays_flattened
    WHERE key = 'ga_session_id'
    GROUP BY  id)
SELECT AVG(duration)
FROM duration


来源:https://stackoverflow.com/questions/55847381/where-i-can-find-average-session-duration-in-firebase-analytics-how-to-extract

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!