BigQuery与Google Analytics报告中的总会话数

时间:2015-05-24 03:22:54

标签: google-analytics google-bigquery

我只是在学习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的文档,但在这个问题上找不到任何内容。

提前致谢,

4 个答案:

答案 0 :(得分:10)

只需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:对重新连接midnight-splits非常有用
  • 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会话错误和误解的可能性太大

答案 1 :(得分:8)

在发布问题之后,我们与Google支持人员联系,发现在Google Analytics中,只会触发发生“事件”的会话。

在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
)

答案 2 :(得分:1)

问题可能是由于“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")'))

答案 3 :(得分:0)

对我有用的是:

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 的会话。