【问题标题】:How to calculate Session and Session duration in Firebase Analytics raw data?如何在 Firebase Analytics 原始数据中计算会话和会话持续时间?
【发布时间】:2017-07-21 16:06:04
【问题描述】:

如何在与 BigQuery 关联的 Firebase 分析原始数据中计算 会话持续时间

我已经使用以下博客通过使用 flatten 命令计算每个记录中嵌套的事件的用户数,但我想知道如何继续计算 Session会话持续时间(按国家和时间)。

(我配置了很多应用程序,但如果您能帮助我使用 SQL 查询来计算会话持续时间和会话,那将有很大帮助)

Google Blog on using Firebase and big query

【问题讨论】:

  • Firebase 最近添加了一些新的会话参数。我认为this blog 现在可能更准确。

标签: sql firebase google-bigquery tableau-api firebase-analytics


【解决方案1】:

最近我们在 BigQuery 表中为每个事件行添加了 ga_session_id,您可以更轻松地计算会话数和平均会话长度。

ga_session_id 的值在整个会话中保持不变,因此您无需单独定义会话。

您可以通过按 user_pseudo_id 、 ga_session_id 和 event_date 对结果进行分组来获取 event_timestamp 列的 Min 和 Max 值,以便获得任何用户在任何给定日期的特定会话的会话持续时间。

WITH 
UserSessions as (
SELECT
        user_pseudo_id,
        event_timestamp,
        event_date,
        (Select value.int_value from UNNEST(event_params) where key = "ga_session_id") as session_id,
        event_name
      FROM `projectname.dataset_name.events_*`
),
SessionDuration as (
SELECT
user_pseudo_id,
session_id,
COUNT(*) AS events,
TIMESTAMP_DIFF(MAX(TIMESTAMP_MICROS(event_timestamp)), MIN(TIMESTAMP_MICROS(event_timestamp)), SECOND) AS session_duration
,event_date
FROM
UserSessions
WHERE session_id is not null
GROUP BY
user_pseudo_id,
session_id
,event_date
)
Select count(session_id) as NumofSessions,avg(session_duration) as AverageSessionLength from SessionDuration 

最后你只需要计算 session_id 来得到会话总数,然后计算会话持续时间的平均值来得到平均会话长度的值。

【讨论】:

    【解决方案2】:

    在 BigQuery 中使用 Firebase 的新架构后,我发现@Maziar 的答案对我不起作用,但我不知道为什么。 相反,我使用以下方法来计算它,其中会话定义为用户与您的应用程序互动至少 10 秒,如果用户在 30 分钟内未与应用程序互动,则会话停止。 它以分钟为单位提供会话总数和会话长度,它基于以下查询:https://modeanalytics.com/modeanalytics/reports/5e7d902f82de/queries/2cf4af47dba4

    SELECT COUNT(*) AS sessions,
           AVG(length) AS average_session_length
      FROM (
      
    SELECT global_session_id,
           (MAX(event_timestamp) - MIN(event_timestamp))/(60 * 1000 * 1000) AS length
      FROM (
    SELECT user_pseudo_id,
           event_timestamp,
           SUM(is_new_session) OVER (ORDER BY user_pseudo_id, event_timestamp) AS global_session_id,
           SUM(is_new_session) OVER (PARTITION BY user_pseudo_id ORDER BY event_timestamp) AS user_session_id
      FROM (
           SELECT *,
                  CASE WHEN event_timestamp - last_event >= (30*60*1000*1000) 
                         OR last_event IS NULL 
                       THEN 1 ELSE 0 END AS is_new_session
             FROM (
                  SELECT user_pseudo_id,
                         event_timestamp,
                         LAG(event_timestamp,1) OVER (PARTITION BY user_pseudo_id ORDER BY event_timestamp) AS last_event
                    FROM `dataset.events_2019*`
                  ) last
           ) final
           ) session
     GROUP BY 1
           
           ) agg
    WHERE length >= (10/60)

    【讨论】:

    • 这个 30*60*1000*1000 是什么? 10秒还是什么..?和 60 * 1000 * 1000 ..?谢谢。
    • 30*60*1000*1000 为 30 分钟,以微秒为单位,用于设置会话超时持续时间为 30 分钟。所以 60 * 1000 * 1000 是以微秒为单位的 1 分钟。
    • 好的,谢谢玛雅
    • @MajaFromAndersen - 如何获得像 GA 这样的 firebase 会话?
    • @VenkaTeshuser5397700 你能创建一个新问题,然后我可以在那里回答吗?在评论中有点难以做到。
    【解决方案3】:

    如您所知,Google 已更改 BigQuery firebase 数据库的架构: https://support.google.com/analytics/answer/7029846

    感谢@Felipe 的回答,新格式将更改如下:

    SELECT SUM(total_sessions) AS Total_Sessions, AVG(sess_length_seconds) AS Average_Session_Duration
    FROM (
      SELECT user_pseudo_id, sess_id, MIN(min_time) sess_start, MAX(max_time) sess_end, COUNT(*) records, 
        MAX(sess_id) OVER(PARTITION BY user_pseudo_id) total_sessions,
        (ROUND((MAX(max_time)-MIN(min_time))/(1000*1000),1)) sess_length_seconds
      FROM (
        SELECT *, SUM(session_start) OVER(PARTITION BY user_pseudo_id ORDER BY min_time) sess_id
        FROM (
          SELECT *, IF(previous IS null OR (min_time-previous) > (20*60*1000*1000), 1, 0) session_start 
          FROM (
            SELECT *, LAG(max_time, 1) OVER(PARTITION BY user_pseudo_id ORDER BY max_time) previous
            FROM (SELECT user_pseudo_id, MIN(event_timestamp) AS min_time, MAX(event_timestamp) AS max_time
              FROM `dataset_name.table_name` GROUP BY user_pseudo_id)
          )
        )
      )
      GROUP BY 1, 2
      ORDER BY 1, 2
    )
    

    注意:根据您的项目信息更改 dataset_nametable_name

    示例结果:

    【讨论】:

    • 你能解释一下'sess_length_seconds'吗?是秒还是微秒?
    • @Anjum BigQuery 以微秒格式存储所有时间戳,正如您在此查询中看到的那样,我们通过将差异除以 1000*1000 将其转换为秒。 --> (MAX(max_time)-MIN(min_time))/(1000*1000)
    • @MaziarManouchehry 的总会话与 GA 会话相同吗?
    【解决方案4】:

    首先,您需要定义一个会话 - 在以下查询中,只要用户不活动超过 20 分钟,我就会中断会话。

    现在,要使用 SQL 查找所有会话,您可以使用https://blog.modeanalytics.com/finding-user-sessions-sql/ 中描述的技巧。

    以下查询查找所有会话及其长度:

    #standardSQL
    
    SELECT app_instance_id, sess_id, MIN(min_time) sess_start, MAX(max_time) sess_end, COUNT(*) records, MAX(sess_id) OVER(PARTITION BY app_instance_id) total_sessions,
       (ROUND((MAX(max_time)-MIN(min_time))/(1000*1000),1)) sess_length_seconds
    FROM (
      SELECT *, SUM(session_start) OVER(PARTITION BY app_instance_id ORDER BY min_time) sess_id
      FROM (
        SELECT *, IF(
                    previous IS null 
                    OR (min_time-previous)>(20*60*1000*1000),  # sessions broken by this inactivity 
                    1, 0) session_start 
                    #https://blog.modeanalytics.com/finding-user-sessions-sql/
        FROM (
          SELECT *, LAG(max_time, 1) OVER(PARTITION BY app_instance_id ORDER BY max_time) previous
          FROM (
            SELECT user_dim.app_info.app_instance_id
              , (SELECT MIN(timestamp_micros) FROM UNNEST(event_dim)) min_time
              , (SELECT MAX(timestamp_micros) FROM UNNEST(event_dim)) max_time
            FROM `firebase-analytics-sample-data.ios_dataset.app_events_20160601`
          )
        )
      )
    )
    GROUP BY 1, 2
    ORDER BY 1, 2
    

    【讨论】:

    • user_engagement 有一个 event_dim.params.key,其中包含 engagement_time_msecevent_dim.params.value.int_value i> 包含每个实例的参与时间(以毫秒为单位),您认为此参数可用于计算会话持续时间吗?如果这是真的,它应该比您的计算更容易,因为将参与时间相加来计算会话持续时间似乎很简单。
    • 也许——但使用该值将不允许您像此查询那样灵活地定义会话(这也适用于其他数据集)——我很乐意看看其他人是否提供了替代方案也回答!
    • 你拯救了我的一天
    • 不错的脚本@felipe!我想在这个剧本中挑战一件事(如果你允许的话)。您如何考虑跨越 2 天桌子的用户会话?更具体地说,会话范围从 20160531 到 20160601 以及 20160601 到 20160602 的用户。我想可以在多个表上运行查询,即 WHERE(_TABLE_SUFFIX BETWEEN '20160601' AND '20160630'),但它仍然需要说明这个范围的开始和结束。含义会话 20160531 到 20160601 和 20160630 到 20160701)。想法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 2022-06-23
    • 2017-04-21
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多