我只是在学习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的文档,但在这个问题上找不到任何内容。
提前致谢,
答案 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=1
和GROUP 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 的会话。