计算 BigQuery 中的谷歌分析独特事件

Posted

技术标签:

【中文标题】计算 BigQuery 中的谷歌分析独特事件【英文标题】:Counting google analytics unique events in BigQuery 【发布时间】:2017-05-26 13:54:52 【问题描述】:

我已经设法按 ISOweek 计算总事件,但不是使用 BigQuery 计算给定 Google Analytics 事件的唯一事件。在检查 GA 时,total_events 与点上的 GA 接口匹配,但 unique_events 处于关闭状态。你知道我该如何解决这个问题吗?

查询:

SELECT INTEGER(STRFTIME_UTC_USEC(PARSE_UTC_USEC(date),"%V")) iso8601_week_number,
hits.eventInfo.eventCategory,
hits.eventInfo.eventAction,
COUNT(hits.eventInfo.eventCategory) AS total_events,
EXACT_COUNT_DISTINCT(fullVisitorId) AS unique_events
FROM
    TABLE_DATE_RANGE([XXXXXX.ga_sessions_], TIMESTAMP('2017-05-01'), TIMESTAMP('2017-05-07'))
WHERE
  hits.type = 'EVENT' AND hits.eventInfo.eventCategory = 'BIG_Transaction'
GROUP BY
iso8601_week_number, hits.eventInfo.eventCategory, hits.eventInfo.eventAction

【问题讨论】:

如果在 where 子句中添加 AND totals.visits=1 会发生什么?有用吗? 嗨@Will 在添加 AND totals.visits=1 时,unique_events 仍然关闭。你知道我可以尝试的其他方法吗? 嗯不知道为什么它不工作。其他的事情是确保你的TABLE_DATE_RANGE 不包括intradays 和ga_sessions 表(什么会导致数据重复),也可以确保GA 中的分析是否正确完成。除此之外,我在此查询中看不到任何错误(如果有,我看不到)。另外,我建议您使用 BQ 的标准版本。 cloud.google.com/bigquery/docs/reference/standard-sql 好多了。 @will "TABLE_DATE_RANGE 不同时包括盘中和 ga_sessions 表(什么会导致数据重复)" 使用过去设置的日期范围,BigQuery 仍会评估盘中还是只是以防万一我将今天的日期包括在范围内?感谢您提供标准 SQL 提示。 有时盘中表格不会被删除,因此根据您选择过去表格的方式,您最终可以同时查询这两个表格。 【参考方案1】:

根据范围你需要count(distinct )不同的东西,但你总是需要满足这些条件:

唯一事件是指类别、动作和标签的组合 确保eventAction 不是NULL 确保eventLabel 不是NULL eventCategory 允许为 NULL

我使用COALESCE() 来避免NULLs

示例会话范围

SELECT
  SUM( (SELECT COUNT(h.eventInfo.eventCategory) FROM t.hits h) ) events,
  SUM( (SELECT COUNT(DISTINCT 
    CONCAT( h.eventInfo.eventCategory,
      COALESCE(h.eventinfo.eventaction,''),
      COALESCE(h.eventinfo.eventlabel, ''))
      )
    FROM
      t.hits h ) ) uniqueEvents
FROM
  `google.com:analytics-bigquery.LondonCycleHelmet.ga_sessions_20130910` t

示例命中范围

SELECT
  h.eventInfo.eventCategory,
  COUNT(1) events,
  -- we need to take sessions into account, so we add fullvisitorid and visitstarttime
  COUNT(DISTINCT CONCAT(fullvisitorid, CAST(visitstarttime AS string), 
    COALESCE(h.eventinfo.eventaction,''), 
    COALESCE(h.eventinfo.eventlabel, ''))) uniqueEvents
FROM
  `google.com:analytics-bigquery.LondonCycleHelmet.ga_sessions_20130910` t,
  t.hits h
WHERE
  h.type='EVENT'
GROUP BY
  1
ORDER BY
  2 DESC

hth!

【讨论】:

【参考方案2】:

Google Analytics 中唯一事件的定义是:

具有类别/动作/标签的事件的次数计数 在会话中至少看到一次价值。

换句话说,发送特定事件(由类别、操作和标签定义)的会话数。在您的查询中,您计算​​拥有该事件的唯一身份访问者的数量,同时您需要计算会话数量并记住具有不同标签的事件应计为不同的唯一事件(尽管我们只对类别和行动)。

修复代码的一种可能方法是:

SELECT 
  INTEGER(STRFTIME_UTC_USEC(PARSE_UTC_USEC(date),"%V")) iso8601_week_number,
  hits.eventInfo.eventCategory,
  hits.eventInfo.eventAction,
  COUNT(hits.eventInfo.eventCategory) AS total_events,
  EXACT_COUNT_DISTINCT(CONCAT(fullVisitorId,'-',string(visitId),'-',date,'-',ifnull(hits.eventInfo.eventLabel,'null'))) AS unique_events    
FROM
  TABLE_DATE_RANGE([XXXXXX.ga_sessions_], TIMESTAMP('2017-05-01'), TIMESTAMP('2017-05-07'))
WHERE
  hits.type = 'EVENT' AND hits.eventInfo.eventCategory = 'BIG_Transaction'
GROUP BY
    iso8601_week_number, hits.eventInfo.eventCategory, hits.eventInfo.eventAction

本次查询的结果应与GA界面中的数据相匹配。

【讨论】:

【参考方案3】:

我认为问题在于您只计算完成指定操作的唯一身份访问者的数量,而 GA 将唯一身份事件定义为 “在一个日期范围内会话包含特定维度的次数” .

因此,我只需将您的代码更改为以下内容:

SELECT INTEGER(STRFTIME_UTC_USEC(PARSE_UTC_USEC(date),"%V")) iso8601_week_number,
hits.eventInfo.eventCategory,
hits.eventInfo.eventAction,
COUNT(hits.eventInfo.eventCategory) AS total_events,
EXACT_COUNT_DISTINCT(CONCAT(fullVisitorId, STRING(visitId))) AS unique_events
FROM
    TABLE_DATE_RANGE([XXXXXX.ga_sessions_], TIMESTAMP('2017-05-01'), TIMESTAMP('2017-05-07'))
WHERE
  hits.type = 'EVENT' AND hits.eventInfo.eventCategory = 'BIG_Transaction'
GROUP BY
iso8601_week_number, hits.eventInfo.eventCategory, hits.eventInfo.eventAction

这应该为您提供具有给定事件的会话的不同计数。

【讨论】:

如何使用标准 SQL 语法?【参考方案4】:

我们用一些很酷的 CTE 做了一些类似于 @Martin 建议的事情,我们能够 100% 匹配 BigQuery 的 Google Analytics(分析)结果。

查看下面的代码 sn-p,它返回每天的会话总和 + 唯一的添加到购物车事件:

   #standardSQL
WITH AN_ATC AS 
(
  SELECT
    -- full date w/ hyphens (ie 2021-01-07)
      CAST(format_date('%Y-%m-%d', parse_date("%Y%m%d", date)) AS DATE) as DATE,
      -- COUNT OF SESSIONS
      COUNT(DISTINCT CONCAT(fullVisitorId, CAST(visitStartTime AS STRING))) AS Sessions,
      -- COUNT OF UNIQUE EVENTS PER SESSION
       COUNT(DISTINCT CONCAT(fullvisitorid, CAST(visitstarttime AS string), 
        COALESCE(hits.eventinfo.eventaction,''), 
        COALESCE(hits.eventinfo.eventlabel, ''))) AS EVENTS
  
  FROM `an-big-query.PROJECT_ID.ga_sessions_*` , 
  UNNEST(hits) as hits
  WHERE
  -- start date
  _table_suffix BETWEEN '20190101'
  -- yesterday
  AND FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY)) 
  AND hits.eventInfo.eventAction = 'add to cart'
  GROUP BY 
    date
)
SELECT
DATE,
SESSIONS,
EVENTS
FROM AN_ATC
ORDER BY date DESC

在哪里,

SESSIONS = 谷歌分析 ga:Sessions

事件 = 谷歌分析 ga:uniqueEvents

两者都带有 eventAction=@add 到购物车

希望对搜索/谷歌搜索的每个人都有帮助!

【讨论】:

刚刚阅读了这个,我遇到了类似的问题,但自定义尺寸。有谁知道自定义尺寸是否必须包含在合并功能中? COUNT(DISTINCT CONCAT(fullvisitorid, CAST(visitstarttime AS string), COALESCE(h.eventinfo.eventaction,''), COALESCE(h.eventinfo.eventlabel, ''), COALESCE(h.customDimensions)))) uniqueEvents 在当我尝试合并自定义维度时,BigQuery 和 GA 之间的数据每天有 2% 到 6% 的差异有其他人经历过吗?

以上是关于计算 BigQuery 中的谷歌分析独特事件的主要内容,如果未能解决你的问题,请参考以下文章

无法为 Firebase 中的 bigquery 链接启用谷歌分析

用于 IOS 的谷歌分析 SDK 不再跟踪屏幕或事件。曾经工作

如何在 BigQuery 中导出所有谷歌分析数据 [重复]

如何通过 Firebase 中的某些用户事件过滤 BigQuery 中的保留计算

bigquery中的GA4流量源数据不正确

Firebase Analytics 中的事件未显示在 Big Query 中