【问题标题】:Total Sessions in BigQuery vs Google Analytics ReportsBigQuery 与 Google Analytics 报告中的总会话数
【发布时间】:2015-08-05 20:07:20
【问题描述】:

我刚刚学习 BigQuery,所以这可能是一个愚蠢的问题,但我们希望在那里获得一些统计数据,其中之一是给定一天的总会话数。

为此,我在 BQ 中查询过:

select sum(sessions) as total_sessions from (
  select
    fullvisitorid,
    count(distinct visitid) as sessions,
    from (table_query([40663402], 'timestamp(right(table_id,8)) between timestamp("20150519") and timestamp("20150519")'))
    group each by fullvisitorid
)

(我使用table_query,因为稍后我们可能会增加天数)

这导致1,075,137

但在我们的 Google Analytics(分析)报告中,在“受众概览”部分,同一天的结果:

This report is based on 1,026,641 sessions (100% of sessions).

尽管这一天,总有大约 5% 的差异。所以我想知道,即使查询很简单,我们是否犯了任何错误?

这种差异会发生吗?我通读了 BigQuery 的文档,但在此问题上找不到任何内容。

提前致谢,

【问题讨论】:

  • 如果您尝试 EXACT_COUNT_DISTINCT(visitid) 会发生什么?
  • 嗨@FelipeHoffa。我也试过这个,但得到了同样的结果。
  • 我仍然有这个问题。你找到原因了吗?
  • 嗨@tomb,是的,我们确实知道了。我们联系了 Google 的技术支持,他们告诉我们,在 Google Analytics(分析)报告中,我们只有具有一些“事件”交互的会话。另一方面,在 Bigquery 中包含触发或不触发事件的所有会话。为了获得与分析相同的结果,您必须在 where 子句中添加“totals.visits = 1”。我会写一个这个问题的答案来更好地解释一下;)

标签: google-analytics google-bigquery


【解决方案1】:

对我有用的是:

SELECT count(distinct sessionId) FROM(
   SELECT CONCAT(clientId, "-", visitNumber, "-", date) as sessionId FROM `project-id.dataset-id.ga_sessions_*`
   WHERE _table_suffix BETWEEN "20191001" AND "20191031" AND totals.visits = 1)

解释(发现写得很好 这篇文章:https://adswerve.com/blog/google-analytics-bigquery-tips-users-sessions-part-one/) 是在计算和处理会话时我们应该小心,因为默认情况下,Google Analytics 会中断在午夜(视图的时区)结转的会话。因此,同一会话可能会出现在两个每日表中:

Image from article mentioned above

提供的代码通过组合创建一个 sessionID: 客户ID + 访问次数+ 日期 同时确认会话中断;结果将采用人类可读的格式。最后,要在 Google Analytics(分析)用户界面中匹配会话,请确保仅过滤 totals.visits = 1 的会话。

【讨论】:

  • 如果您能在此处解释代码而不是强制点击,那就更好了。
【解决方案2】:

只需SUM(totals.visits) 或在使用COUNT(DISTINCT CONCAT(fullVisitorId, CAST(visitStartTime AS STRING) )) 时确保totals.visits=1

如果您使用visitId 并且您没有每天分组,您将合并午夜分割会话!

以下是所有场景:

SELECT
  COUNT(DISTINCT CONCAT(fullVisitorId, CAST(visitStartTime AS STRING) )) allSessionsUniquePerDay,
  COUNT(DISTINCT CONCAT(fullVisitorId, CAST(visitId AS STRING) )) allSessionsUniquePerSelectedTimeframe,
  sum(totals.visits) interactiveSessionsUniquePerDay, -- equals GA UI sessions
  COUNT(DISTINCT IF(totals.visits=1, CONCAT(fullVisitorId, CAST(visitId AS STRING)), NULL) ) interactiveSessionsUniquePerSelectedTimeframe,
  SUM(IF(totals.visits=1,0,1)) nonInteractiveSessions
FROM
  `project.dataset.ga_sessions_2017102*`

总结:

  • fullVisitorId + visitId:对重新连接午夜分割很有用
  • fullVisitorId + visitStartTime:考虑拆分很有用
  • totals.visits=1 用于互动会话
  • fullVisitorId + visitStartTime 其中totals.visits=1:GA UI 会话(如果您需要会话 ID)
  • SUM(totals.visits): 简单的 GA UI 会话
  • fullVisitorId + visitId 其中totals.visits=1GROUP BY date:GA UI 会话有太多错误和误解的机会

【讨论】:

  • midnight-split-sessions --- 为什么没有记录在案……我因此浪费了这么多时间。
【解决方案3】:

在发布问题后,我们联系了 Google 支持,发现在 Google Analytics(分析)中,实际上只计算了触发“事件”的会话。

在 Bigquery 中,您将找到所有会话,无论它们是否有交互。

为了找到与 GA 中相同的结果,您应该在 BQ 查询中按带有 totals.visits = 1 的会话进行过滤(totals.visits 仅适用于触发事件的会话)。

即:

select sum(sessions) as total_sessions from (
  select
    fullvisitorid,
    count(distinct visitid) as sessions,
    from (table_query([40663402], 'timestamp(right(table_id,8)) between timestamp("20150519") and timestamp("20150519")'))
    where totals.visits = 1
    group each by fullvisitorid
)

【讨论】:

  • 你知道如何计算每小时的会话数吗?不幸的是,按 fullVisitorId、hits.hour 分组或只是过滤掉 where 部分中的特定时间并没有给我与谷歌分析中相同的结果。 SELECT fullvisitorid, h.hour, count(distinct visitid) as sessions, FROM XXX.ga_sessions_*, UNNEST(hits) as h WHERE (_table_suffix = '20210907' ) AND totals.visits = 1 --AND h.hour = 8 group by fullvisitorid, h.hour
  • @Agnieszka 我建议发布一个新问题来描述您的查询、所需结果和当前结果。不知道为什么会发生这种情况,但问题可能与发生在 hits 字段上的取消嵌套过程有关,如果处理不当,最终会重复行并扭曲结果。
【解决方案4】:

问题可能是由“COUNT DISTINCT”引起的。

this post

COUNT DISTINCT 是大于 1000 的所有结果的统计近似值

您可以尝试设置一个额外的 COUNT 参数来提高准确性,但会牺牲性能(请参阅帖子),但我会先尝试:

SELECT COUNT( CONCAT( fullvisitorid,'_', STRING(visitid))) as sessions 
from (table_query([40663402], 'timestamp(right(table_id,8)) between 
timestamp("20150519") and timestamp("20150519")'))

【讨论】:

  • 我在这个查询中也使用了 EXACT_COUNT_DISTINCT,但得到了相同的结果。还不知道出了什么问题
  • 上述方法对我有用,但一个关键的区别是我们网站的每日会话数要少得多。也许在高级 GA 帐户附带的支持下与 Google 联系...一定要分享任何见解!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多