BigQuery 在同一查询中展平 GA 会话和命中级别字段

Posted

技术标签:

【中文标题】BigQuery 在同一查询中展平 GA 会话和命中级别字段【英文标题】:BigQuery flattening both GA session and hit level fields in the same query 【发布时间】:2018-01-30 15:22:41 【问题描述】:

在标准 SQL 中,我希望能够在同一查询中查询以下所有内容

自定义维度 hits.customDimensions hits.customMetrics hits.product.customDimensions

到目前为止,我已经想出了类似的东西(包括两个 GA 属性的 UNION,一个用于移动设备,另一个用于桌面)- 我将添加比这更多的列,我无法想象将它们全部作为子选择是最好的方法:

SELECT
# standard session fields
date,
fullVisitorId,
visitId,
visitNumber,
TIMESTAMP_SECONDS(visitStartTime) visitStartTime,
totals.visits,
device.deviceCategory,
totals.hits,
totals.newVisits,
totals.pageviews,
totals.timeOnSite,
trafficSource.adContent,
trafficSource.campaign,
trafficSource.keyword,
trafficSource.medium,
trafficSource.referralPath,
trafficSource.source,
channelGrouping,
device.browser,
device.browserSize,
device.browserVersion,
device.mobileDeviceInfo,
device.mobileDeviceModel,
device.operatingSystem,
device.mobileDeviceBranding,
geoNetwork.country,
geoNetwork.city,
# Session/User customDimension Example
(SELECT cd.value FROM UNNEST(customDimensions) cd WHERE cd.index=20 and REGEXP_CONTAINS(cd.value, "\\d")) userId,

# hits customMetrics Example
SUM((SELECT SUM(hcm.value) FROM UNNEST(hits) h,UNNEST(h.customMetrics) hcm WHERE hcm.index=28)) totalBooking,

# hits customDimension Example
SUM((SELECT COUNT(hcd.value) FROM UNNEST(hits) h,UNNEST(h.customDimensions) hcd WHERE hcd.index=20)) h_cd1,

# hits products customDimension Example
SUM((SELECT COUNT(hpc.value) FROM UNNEST(hits) h,UNNEST(h.product) hp,UNNEST(hp.customDimensions) hpc WHERE hpc.index=1)) h_pc1,
SUM((SELECT COUNT(hpc.value) FROM UNNEST(hits) h,UNNEST(h.product) hp,UNNEST(hp.customDimensions) hpc WHERE hpc.index=2)) h_pc2,
SUM((SELECT COUNT(hpc.value) FROM UNNEST(hits) h,UNNEST(h.product) hp,UNNEST(hp.customDimensions) hpc WHERE hpc.index=3)) h_pc3,
SUM((SELECT COUNT(hpc.value) FROM UNNEST(hits) h,UNNEST(h.product) hp,UNNEST(hp.customDimensions) hpc WHERE hpc.index=4)) h_pc4,
SUM((SELECT COUNT(hpc.value) FROM UNNEST(hits) h,UNNEST(h.product) hp,UNNEST(hp.customDimensions) hpc WHERE hpc.index=5)) h_pc5,
SUM((SELECT COUNT(hpc.value) FROM UNNEST(hits) h,UNNEST(h.product) hp,UNNEST(hp.customDimensions) hpc WHERE hpc.index=6)) h_pc6,
SUM((SELECT COUNT(hpc.value) FROM UNNEST(hits) h,UNNEST(h.product) hp,UNNEST(hp.customDimensions) hpc WHERE hpc.index=7)) h_pc7,
SUM((SELECT COUNT(hpc.value) FROM UNNEST(hits) h,UNNEST(h.product) hp,UNNEST(hp.customDimensions) hpc WHERE hpc.index=8)) h_pc8,
SUM((SELECT COUNT(hpc.value) FROM UNNEST(hits) h,UNNEST(h.product) hp,UNNEST(hp.customDimensions) hpc WHERE hpc.index=9)) h_pc9,

FROM (
  SELECT
  *
  FROM
  `abcdefgh.12345678.ga_sessions_*` desktopProperty
  WHERE
  _TABLE_SUFFIX BETWEEN '20180122' AND '20180122'
  UNION ALL
  SELECT
  *
  FROM
  `abcdefgh.12345678.ga_sessions_*` mobileProperty
  WHERE
  _TABLE_SUFFIX BETWEEN '20180122' AND '20180122'
  ) table
GROUP BY
  date,
  fullVisitorId,
  visitId,
  visitNumber,
  visitStartTime,
  totals.visits,
  device.deviceCategory,
  totals.hits,
  totals.newVisits,
  totals.pageviews,
  totals.timeOnSite,
  trafficSource.adContent,
  trafficSource.campaign,
  trafficSource.keyword,
  trafficSource.medium,
  trafficSource.referralPath,
  trafficSource.source,
  channelGrouping,
  device.browser,
  device.browserSize,
  device.browserVersion,
  device.mobileDeviceInfo,
  device.mobileDeviceModel,
  device.operatingSystem,
  device.mobileDeviceBranding,
  geoNetwork.country,
  geoNetwork.city,
  userId
ORDER BY
date

【问题讨论】:

到底是什么问题?您在问如何使选择列表中的表达式不那么冗长?如果您想对 index 的各种值求和,您可以定义一个 SQL UDF 并改为调用它。 是的,我想说的不那么冗长。我想我正在尝试验证上述方法是最有效的方法。我正在尝试创建一个查询,该查询基本上每个会话都有一行,其中包含很多列,其中包括会话级别字段和命中级别字段的聚合。 我觉得在你的问题中有一个更完整的例子会有所帮助。很难说在实际查询中什么是多余的。 我已经继续更新帖子以包含更完整的示例 【参考方案1】:

如果您停留在会话级别,则不需要GROUP BY,因为源表已经在会话范围内。所以你可以摆脱它。然后,您还必须删除子选择周围的聚合函数。只需将所有内容都带到所需的范围 -

将不同范围引入会话级别的示例:

SELECT
  date AS sessionScope,
  (SELECT count(hitNumber) FROM t.hits) hitScope,
  (SELECT SUM(IF(cd.value='example',1,0)) FROM t.hits AS h, h.customDimensions cd WHERE cd.index=1) hitCdScope,
  (SELECT COUNT(p.productSku) FROM t.hits AS h, h.product AS p WHERE h.ecommerceaction.action_type='6') productScope
FROM
  `project.dataset.ga_sessions_20180127` AS t
WHERE
  totals.transactions > 0
LIMIT
  1000

【讨论】:

完美,谢谢你的解释!当然,如果尝试将所有内容都放在会话范围内,则不需要 GROUP BY。 另外,在子选择中,我可以直接访问表和记录以及取消嵌套它们。有没有取消嵌套的点? 某些表操作不适用于数组 - 在这些情况下,您必须先取消嵌套它们。我只是不使用它,除非 bq 抱怨这个数组不是一个表;) 啊,完全有道理。我会采用这种方法,如果它呻吟,unnest!再次感谢 也许需要注意:取消嵌套时,您也会破坏元素的顺序。对于数组,您可以执行hits[OFFSET(0)] 之类的操作。这就是为什么有这个扩展给你一个索引:UNNEST(hits) WITH OFFSET AS index

以上是关于BigQuery 在同一查询中展平 GA 会话和命中级别字段的主要内容,如果未能解决你的问题,请参考以下文章

在 Google 跟踪代码管理器中使用 GA Bigquery 导出架构变量

每个着陆内容分组的会话中 Bigquery 和 GA 之间的差异

初学者 GA 导出 bigquery 问题

Google Analytics“用户计数”与大查询“用户计数”不匹配

BigQuery 中记录类型与展平表的查询性能

查看 Google Analytics 时如何 UNNEST 和展平 BigQuery 中的所有记录