【问题标题】:How to find total sessions played in BigQuery?如何查找 BigQuery 中播放的总会话数?
【发布时间】:2020-03-26 12:59:30
【问题描述】:
如何找出一个月时间范围内所有用户玩的总会话数。事件 user_engagement 有一个参数 session count,该参数在每个会话中递增。问题是玩 10 个会话的用户的会话计数为 1 到 10。那么我应该如何只添加最大会话计数,即在这种情况下为 10,对于所有用户也是如此。
SELECT
SUM(session_count) AS total_sessions,
COUNT(DISTINCT user_pseudo_id) AS users
FROM
`xyz.analytics_111.events_*`
WHERE
event_name = "user_engagement" AND (_TABLE_SUFFIX BETWEEN "20200201" AND "20200229")
AND platform = "ANDROID"
【问题讨论】:
标签:
sql
firebase
session
google-analytics
google-bigquery
【解决方案1】:
试试下面(BigQuery 标准 SQL)
#standardSQL
SELECT
SUM(session_count) AS total_sessions,
COUNT(user_pseudo_id) AS users
FROM (
SELECT user_pseudo_id, MAX(session_count) session_count
FROM `xyz.analytics_111.events_*`
WHERE event_name = "user_engagement"
AND _TABLE_SUFFIX BETWEEN "20200201" AND "20200229"
AND platform = "ANDROID"
GROUP BY user_pseudo_id
)
【解决方案2】:
我不清楚您的数据是什么样的。如果每个会话有一行,那么您可以简单地使用:
SELECT COUNT(*) AS total_sessions,
COUNT(DISTINCT user_pseudo_id) AS users
. . .
如果每个会话可以有多个事件,则可以使用 hacky 方法:
SELECT COUNT(DISTINCT CONCAT(user_pseudo_id, ':', CAST(session_count as string)))
我提供这个,因为有时在复杂的查询中,只调整一行会更简单。否则,米哈伊尔的解决方案是合理的。
不过,我建议改为使用窗口函数:
SELECT SUM(CASE WHEN seqnum = 1 THEN session_count END) AS total_sessions,
COUNT(DISTINCT user_pseudo_id) AS users
FROM (SELECT e.*,
ROW_NUMBER() OVER (PARTITION BY user_pseudo_id ORDER BY session_count DESC) as seqnum
FROM `xyz.analytics_111.events_*`
WHERE e.event_name = 'user_engagement' AND
_TABLE_SUFFIX BETWEEN '20200201' AND '20200229' AND
platform = 'ANDROID'
) e;
我推荐这样做的原因是因为您可以保留其余的计算而不更改它们。这在复杂查询中很方便。