BigQuery 中的总会话数与 Google 分析报告

Total Sessions in BigQuery vs Google Analytics Reports

我刚刚开始学习 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 分析报告中,在 "Audience Overview" 部分,同一天的结果:

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

尽管是一天,但始终存在大约 ~5% 的差异。所以我想知道,即使查询非常简单,我们是否犯了任何错误?

这种差异是否会发生?我通读了 BigQuery 的文档,但找不到有关此问题的任何信息。

提前致谢,

问题可能是由于 "COUNT DISTINCT"。

根据this post

COUNT DISTINCT is a statistical approximation for all results greater than 1000

您可以尝试设置一个额外的 COUNT 参数,以牺牲性能为代价来提高准确性(参见 post),但我会首先尝试:

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

发布问题后,我们联系了 Google 支持人员,发现在 Google Analytics 中,只有 "event" 被触发的会话才被实际计算在内。

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

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

即:

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
)

只需 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 会话有太多错误和误解的机会

对我有用的是:

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: client id + 拜访号 + 日期 同时确认会话中断;结果将采用人类可读的格式。最后,要匹配 Google Analytics UI 中的会话,请确保仅过滤到 totals.visits = 1.

的会话