我在哪里可以找到 Firebase Analytics 中的平均会话持续时间。如何通过 Bigquery 提取这些指标

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

  1. 在哪里可以找到平均。 Firebase 分析中的会话持续时间指标?
  2. 如何提取平均。来自 Bigquery 的会话持续时间指标数据?

平均。之前在 Firebase 分析仪表板中可用的会话持续时间指标。但现在,它在 Firebase 分析仪表板中不可用。现在,我们只看到 "Engagement Per User"。是每个用户的参与度和平均。会话持续时间两者是否相同?如何提取平均。 Fiebase 分析的会话持续时间?如何在 Bigquery 中查询以提取 Avg。来自 Firebase 的会话持续时间指标。 enter image description here

每位用户的参与度与平均参与度不同。会话持续时间。每个用户的参与度是指用户一天内在应用中花费的所有时间,而不是在一个会话中。

  1. 您可以找到平均。最新版本下 Firebase Analytics 中的会话持续时间。

  2. 这是计算平均值的查询。 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

关于如何获取 event_date 和 app_info.id 的其他问题,请参阅以下查询:

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

每个会话(自 2019 年 12 月起在此处定义:https://firebase.googleblog.com/2018/12/new-changes-sessions-user-engagement.html)都有一个 session_id(除了其他参数)。我认为计算平均会话持续时间的最安全和最稳健的方法是将数据提取到 BigQuery,然后按会话计算第一个和最后一个时间戳之间的平均差异。为此,您需要展平 event_params 的数组。例如,这就是在 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