【问题标题】:Sessions by hits.page.pagePath in GA bigquery tablesGA bigquery 表中的 hits.page.pagePath 会话
【发布时间】:2015-04-30 13:19:31
【问题描述】:

我是 bigquery 的新手,如果这是一个菜鸟问题,我很抱歉!我有兴趣按页面路径或标题划分会话。我了解一个会话可以包含多个路径/标题,因此总和将大于会话总数。本质上,我想创建一个“会话 ID”并计算不同的会话 ID,其中路径如 a 或 b。

从一开始就手动计算总会话数实际上可能会有所帮助。我试图连接访问 id 和完整的访问者 id 以创建一个唯一的访问 id,但显然这与会话有很大不同。有人可以帮助启发我吗?谢谢!

我正在处理我们的 GA 网站数据。架构是 standard in GA 导出。

数据样本

让我们使用样本BigQuery (London Helmet) data中的一个例子:

这一天有 63 节课:

SELECT count(*) FROM [google.com:analytics-bigquery:LondonCycleHelmet.ga_sessions_20130910]

这些会话中有多少是 hits.page.pagePath 之类的 /vests% 或 /helmets%?仅背心与仅头盔有多少?谢谢!

【问题讨论】:

  • 介意发布您已有的查询,或者您正在使用的表的架构?我个人想知道我正在为哪个表编写查询:)。提供一个示例数据集,以及您希望该数据集的预期输出:)
  • 我相信他的意思是 Google Analytics 导出到 BigQuery 生成的标准架构
  • 感谢您的回复帕特里斯!我正在处理我们的 GA 站点数据。 Schema 是 GA 导出中的标准:support.google.com/analytics/answer/3437719?hl=en 让我们使用示例 bigquery(伦敦头盔)数据中的一个示例:support.google.com/analytics/answer/3416091?hl=en 今天有 63 个会话:SELECT count(*) FROM [google.com:analytics- bigquery:LondonCycleHelmet.ga_sessions_20130910] 这些会话中有多少是 hits.page.pagePath 之类的 /vests% 或 /helmets%?谢谢!
  • @MoshaPasumansky 确实如此。发表评论后,我查找了 BQ 和分析,并认为这是一个标准模式 :)

标签: google-analytics google-bigquery


【解决方案1】:

方法 1,更简单,但您需要在每个字段上重复

显然你可以这样做:

SELECT count(*) FROM [google.com:analytics-bigquery:LondonCycleHelmet.ga_sessions_20130910] WHERE hits.page.pagePath like '/helmets%'

然后对您自己的子字符串进行多个查询(一个使用“/vests%”,一个使用“helmets%”等)。

方式 2,工作正常,但不能重复字段

如果你想要一个只在字符串的第一部分分组的查询,你可以这样做:

Select a, Count(*) FROM (SELECT FIRST(SPLIT(hits.page.pagePath, '/')) as a  FROM [google.com:analytics-bigquery:LondonCycleHelmet.ga_sessions_20130910] ) group by a

当我这样做时,它会返回以下 63 个会话,总数为 63 :)。

方法 3,使用桌面上的 FLATTEN 来单独获得每个击球

由于“命中”字段是可重复的,因此您需要在查询中使用 FLATTEN:

Select a, Count(*) FROM (SELECT FIRST(SPLIT(hits.page.pagePath, '/')) as a  FROM FLATTEN ([google.com:analytics-bigquery:LondonCycleHelmet.ga_sessions_20130910] , hits)) group by a

这里需要 FLATTEN 的原因是“命中”字段是可重复的。如果您不展平,它将不会查看您的回复中的所有“点击”。添加“FLATTEN”将使您处理一个子表,其中每个命中都在自己的行中,因此您可以查询所有这些。

如果你想通过会话而不是点击来获得它,(它会两者兼而有之),请执行以下操作:

Select b, a Count(*) FROM (SELECT FIRST(SPLIT(hits.page.pagePath, '/')) as a, visitID as b, FROM FLATTEN ([google.com:analytics-bigquery:LondonCycleHelmet.ga_sessions_20130910] , hits)) group by b, a

【讨论】:

  • 谢谢帕特里斯!我注意到只运行 SELECT FIRST(SPLIT(hits.page.pagePath, '/')), hits.page.pagePath FROM [google.com:analytics-bigquery:LondonCycleHelmet.ga_sessions_20130910] 有 63 行,这似乎有点太干净了。您能否再解释一下,因为这是一个会话示例,其中访问者在同一会话期间同时查看头盔和背心:select hits.hitNumber, hits.page.pagePath FROM [google.com:analytics-bigquery: LondonCycleHelmet.ga_sessions_20130910] where visitid=1378805776 and fullvisitorid='380066991751227408' 谢谢!
  • @amysong 是的!这实际上很简单,我只是忘记了展平部分。由于 hits 是一个重复字段,我的查询只是查看每一行的第一个命中。我添加了另一个,在表格上带有“扁平化”,它返回更多数据。使用您的访客 ID 上的扁平化运行它,它给了我 3 个头盔、2 个 null 和 3 个背心,我可以通过查看重复的字段来证实这一点
  • 嗨帕特里斯,这很有帮助,谢谢。扁平化似乎将其降低到命中级别的粒度——所以行数给了我头盔或背心的命中总数。我仍然希望会话而不是命中。所以在这个数据集中,63 次训练中有 362 次总命中……和 97 次头盔命中,但是有多少次头盔训练?希望这是有道理的...谢谢!
  • 确实如此。您只需要添加访问ID(或访问者ID,我猜会话是访问ID),并对其进行分组以及实际路径。看看我的答案的编辑
  • 感谢您帮助我们更好地理解这一点!现在正在玩弄我的数据...
【解决方案2】:

下面是一个示例,说明如何计算是否只有头盔,或只有背心,或既头盔又背心,或两者都没有:

SELECT 
  visitID,
  has_helmets AND has_vests AS both_helmets_and_vests,
  has_helmets AND NOT has_vests AS helmets_only,
  NOT has_helmets AND has_vests AS vests_only,
  NOT has_helmets AND NOT has_vests AS neither_helmets_nor_vests
FROM (
  SELECT
    visitId,
    SOME(hits.page.pagePath like '/helmets%') WITHIN RECORD AS has_helmets,
    SOME(hits.page.pagePath like '/vests%') WITHIN RECORD AS has_vests,
  FROM [google.com:analytics-bigquery:LondonCycleHelmet.ga_sessions_20130910] 
)

【讨论】:

  • 嗨,莫莎,感谢您的回复!这非常有启发性......虽然我认为与@Patrice 存在相同的初始问题,它只查看会话中的第一个命中。有没有一种方法可以将整个会话进行搜索以分组为头盔/背心/两者/两者都不是? Patrice 还提到了扁平化,但最终我仍然在寻找会话计数,而不是点击次数。谢谢!
  • 我不认为它只在第一次点击时看起来 - 它确实会在所有点击中查找。 hits 是一个 REPEATED 字段,而 WITHIN RECORD 确保遍历所有这些字段。 FLATTEN 是有问题的,因为它会消除访问中点击之间的界限。不过,我对 GA 架构不太熟悉,是否还有其他东西可以表示会话(我假设 visitID 是会话 ID)。
  • 知道了。这是开始挖掘的好地方。谢谢!
  • Mosha,对不起,这是一个切题的问题——你能解释一下 SOME() 函数在做什么吗?我很难找到任何关于它的参考资料......我认为它是一个聚合函数?谢谢!
  • 是的,SOME 是聚合函数,并且与 EVERY 一起是 SQL 标准中定义的函数。 SOME 进行逻辑 OR 聚合,而 EVERY 进行逻辑 AND。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
  • 1970-01-01
相关资源
最近更新 更多