首先,你需要定义一个会话 - 在下面的查询中,当用户闲置超过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_msec和** _ event_dim。 params.value.int_value _ **包含每个实例**的**参与时间,你认为这个参数可以用于计算会话持续时间吗? 如果它是真的,它应该比你的计算更容易,因为计算会话持续时间的约定时间似乎是直截了当的。 –
也许 - 但使用这个值将不允许你像这个查询那样灵活地定义会话(这也适用于其他数据集) - 我会很高兴看到别人是否也提供了一个备选答案! –