基于BigQuery按ga_session_id计算Firebase用户会话时长
完善后的BigQuery会话时长统计SQL
针对你的需求,直接通过ga_session_id分组即可实现按会话统计时长,不需要额外的分组序号(grp字段)。以下是优化后的查询语句:
WITH session_events AS ( SELECT event_timestamp, event_name, -- 提取ga_session_id参数值 (SELECT value.int_value FROM UNNEST(event_params) WHERE key = "ga_session_id") AS sessionid FROM `nodal-descent-XXXXX.analytics_XXXXXX.events_intraday_*` ) SELECT sessionid, -- 取会话中session_start事件的时间戳作为会话开始时间 MIN(CASE WHEN event_name = 'session_start' THEN event_timestamp END) AS session_start_ts, -- 取会话中最后一个事件的时间戳作为会话结束时间 MAX(event_timestamp) AS session_end_ts, -- 计算会话时长(秒) TIMESTAMP_DIFF( TIMESTAMP_MICROS(MAX(event_timestamp)), TIMESTAMP_MICROS(MIN(CASE WHEN event_name = 'session_start' THEN event_timestamp END)), SECOND ) AS session_duration_seconds FROM session_events -- 按ga_session_id分组统计每个会话 GROUP BY sessionid -- 过滤掉没有session_start的异常会话(可选) HAVING session_start_ts IS NOT NULL
关键优化点说明:
- 直接通过
sessionid(即ga_session_id)分组,替代原查询中不必要的grp分组逻辑 - 使用
CASE WHEN精准定位每个会话的session_start事件时间戳,避免误取会话内其他事件的最早时间 - 添加
HAVING子句过滤异常会话(比如缺失session_start事件的会话,可根据实际需求选择保留或过滤) - 保留了原查询中
TIMESTAMP_MICROS转换和TIMESTAMP_DIFF计算逻辑,确保时间单位转换正确
内容的提问来源于stack exchange,提问作者Daniel Aparicio
相关产品推荐
相关产品推荐

