我一直在尝试获取 BigQuery 中特定页面的平均参与时间。但我得到的数字与我在 GA4 中看到的数字截然不同。我知道可能会有差异,但这比 GA4 中的数字少 5 倍。
请看下面的截图:
在 GA4 中,我看到的时间对我来说似乎很现实,因为这两页是阅读时间约为 1-2 分钟的文章。然而,当使用 BigQuery 时,我看到大约 20 秒。 (只是为了澄清,在 BQ 输出中没有主页)
经过挖掘,我发现 GA4 UI 中的平均参与时间实际上是特定页面上的总参与时间除以活跃用户数量。使用 GA4 中的探索报告和电子表格导出,我已经能够获得与 GA4 UI 中一样的准确数字。但似乎我无法在 BigQuery 中获取它。
有人设法在 BigQuery 中获取该页面的参与时间吗?我怀疑 SQL 查询中有错误,但经过几个小时的调查后我无法弄清楚。
我还附上了我为此使用的查询部分:
engagement_time AS (
SELECT
page_location.value.string_value AS page_location,
user_pseudo_id,
SUM(engagement_time_msec.value.int_value) AS total_engagement_time_msec
FROM
`XXXXXX`,
UNNEST(event_params) AS page_location,
UNNEST(event_params) AS engagement_time_msec
WHERE
event_name = 'user_engagement'
AND engagement_time_msec.key = 'engagement_time_msec'
AND page_location.key = 'page_location'
AND EXISTS(SELECT 1 FROM UNNEST(event_params) e WHERE e.key = 'page_post_type' AND e.value.string_value = 'post')
AND event_date = '20230926'
GROUP BY
page_location,
user_pseudo_id
)
SELECT
p.page_location AS article_url,
COUNT(DISTINCT p.user_pseudo_id) AS unique_user_count,
COALESCE(SAFE_DIVIDE(SUM(e.total_engagement_time_msec), COUNT(DISTINCT p.user_pseudo_id)) / 1000, 0) AS avg_engagement_time_seconds_per_user
FROM
pageviews p
LEFT JOIN
engagement_time e
ON
p.page_location = e.page_location AND p.user_pseudo_id = e.user_pseudo_id
GROUP BY
article_url
ORDER BY
unique_user_count DESC
LIMIT 5;
我将不胜感激任何提示。谢谢
我还尝试了仅基于页面位置进行连接的不同查询 - 返回的次数非常高。
我怀疑这是因为您没有在公式中排除未参与的会话(没有参与时间)。如果您将参与的会话过滤器添加到您的 where 语句中,它应该可以解决您的问题。
unnest(event_params) where key = 'session_engaged') = '1'
让我用一个场景来解释一下。 假设用户在导航到新页面之前已在页面上按顺序执行了 scroll 和 view_items_list 操作。参数 user_engagement_msec 捕获每个事件的持续时间。当用户导航到不同页面时,名为 user_engagement 的事件名称会触发捕获导航到下一页之前的剩余时间。
删除 where 子句中的 event_name = 'user_engagement' 即可解决问题。