如何从未嵌套的数据(BigQuery 中的 Google Analytics 数据)返回正确的汇总总数

Posted

技术标签:

【中文标题】如何从未嵌套的数据(BigQuery 中的 Google Analytics 数据)返回正确的汇总总数【英文标题】:How to return a correct aggregate total from unnested data (Google Analytics data in BigQuery) 【发布时间】:2017-11-23 08:39:43 【问题描述】:

我正在 BigQuery 中对 GA 数据运行一些查询,当我想从未嵌套的表中返回数据总和时,我遇到了一个反复出现的问题,其中我的总数远高于预期 - 我怀疑未嵌套的行是被计数,导致计数不准确。这是一个例子:

SELECT DATE, SUM(totals.transactions)
FROM `PROJECTNAME.43786551.ga_sessions_20*` AS GBP
    WHERE parse_date('%y%m%d', _table_suffix) between 
    DATE_sub(current_date(), interval 1 day) and
    DATE_sub(current_date(), interval 1 day)
    GROUP BY DATE

返回:

1 20171122 12967

正如预期的那样。接下来,我想使用来自hits. 的字段,这需要我取消嵌套命中,进行查询:

SELECT DATE, SUM(totals.transactions), MIN(hits.page.hostname) AS site
FROM `PROJECTNAME.43786551.ga_sessions_20*` AS GBP
CROSS JOIN UNNEST (hits) as hits
    WHERE parse_date('%y%m%d', _table_suffix) between 
    DATE_sub(current_date(), interval 1 day) and
    DATE_sub(current_date(), interval 1 day)
    GROUP BY DATE

但是,现在的结果显示:

20171122 2320004 www.hostname.com

事务的数量要高得多,我假设它正在计算所有未嵌套的行,我该如何解决这个问题,我想计算未嵌套的表,但也使用未嵌套的字段?

【问题讨论】:

【参考方案1】:

你应该这样做:

    SELECT DATE, SUM(totals.transactions), 
        (SELECT MIN(hit.page.hostname) FROM UNNEST (GBP.hits) AS hit) AS site
        FROM `PROJECTNAME.43786551.ga_sessions_20*` AS GBP
        WHERE parse_date('%y%m%d', _table_suffix) between 
        DATE_sub(current_date(), interval 1 day) and
        DATE_sub(current_date(), interval 1 day)
        GROUP BY DATE, site

【讨论】:

我收到错误 UNNEST expression references column hit which is neither grouped nor aggregated at [2:54] - 好像它把 unnest 看作一个字段? 抱歉,我忘记按站点分组了。这里发生了类似的问题:***.com/questions/40792981/…

以上是关于如何从未嵌套的数据(BigQuery 中的 Google Analytics 数据)返回正确的汇总总数的主要内容,如果未能解决你的问题,请参考以下文章

如何取消嵌套存储为字符串的 bigquery 字段?

如何从 BigQuery 中提取嵌套数据?

如何在存储为字符串的 bigquery 字段中取消嵌套多个数组?

如何使用 bigquery 流向现有记录插入嵌套数据

如何在bigquery中获取重复嵌套字段的长度

如何从 Bigquery 中的这个嵌套 JSON 类型列中查询特定的内容