【问题标题】:Unable to filter using WHERE (Cannot access field hour on a value with type ARRAY<STRUCT<hitNumber INT64, time INT64, hour INT64)无法使用 WHERE 进行过滤(无法访问类型为 ARRAY<STRUCT<hitNumber INT64、时间 INT64、小时 INT64 的值的字段小时)
【发布时间】:2018-11-26 02:15:37
【问题描述】:
#standardSQL
SELECT DISTINCT geoNetwork.country
FROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`
WHERE _TABLE_SUFFIX BETWEEN '20170701' AND '20170701' 
AND
hits.hour > '11'

我正在尝试查看在中午 12 点到午夜之间向 Google Analytics(分析)发送点击的国家/地区列表(在标准 SQL 中) 我正在使用来自https://support.google.com/analytics/answer/3437719?hl=en 的 hits.hour,但出现此错误: 无法访问类型为 ARRAY 的值的字段小时

【问题讨论】:

    标签: sql google-bigquery standards


    【解决方案1】:
    #standardSQL
    SELECT DISTINCT geoNetwork.country
    FROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`
    WHERE _TABLE_SUFFIX BETWEEN '20170701' AND '20170701' 
    AND EXISTS (SELECT 1 FROM UNNEST(hits) hit WHERE hit.hour > 11) 
    

    【讨论】:

    • 嗨,Mikhail,另一位用户 [Gordon] 也评论了这个帖子。我读到了 UNNEST 函数,有点明白它将数组中的所有命中转换为单独的行 - 这是有道理的,因为 GA 会话是由命中组成的。在您的回答中,您有 'AND EXISTS (SELECT 1 FROM...),您能解释一下这部分查询的作用吗? THx
    • @AdilK - 在我的解决方案中,每一行都是根据小时 > 11 的命中来评估的。所以每一行要么存活,要么不存活,取决于 where 子句和 DISTINCT 涉及的行数是与原始根行数相同。在 Gordon 的解决方案中,所有行都在各自的命中交叉连接,然后将小时 > 11 的行涉及到最终的 DISTINCT。当然,最终结果是相同的,但我的解决方案“更短”了它的路径
    • 谢谢。有一个后续问题:我现在正在尝试汇总 transactionRevenue...在一个会话中,一个用户可以有多个会话....在这种情况下,为什么不需要 UNNEST 运算符? SELECT SUM(totals.totalTransactionRevenue) FROM bigquery-public-data.google_analytics_sample.ga_sessions_* WHERE _TABLE_SUFFIX BETWEEN '20170701' 和 '20170701';
    • 请将新问题发布为相应的新问题,我们很乐意为您提供帮助。同时考虑接受答案,如果它对你有帮助。同时回答您最近的后续行动:在这种情况下,您似乎不关心时间,因此无需取消嵌套不会使用的东西:o)
    【解决方案2】:

    你可以修正你的语法:

    SELECT DISTINCT geoNetwork.country
    FROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`
    WHERE _TABLE_SUFFIX BETWEEN '20170701' AND '20170701' AND
          hits[offset(0)].hour > 11
    

    但这并不能真正做到你想要的。相反,您需要unnest(),因为hits 是一个数组。所以:

    SELECT DISTINCT geoNetwork.country
    FROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`,
         unnest(hits) hit
    WHERE _TABLE_SUFFIX BETWEEN '20170701' AND '20170701' and
          hit.hour > 11;
    

    另请注意,hour 似乎是一个数字,因此单引号不合适。

    【讨论】:

      猜你喜欢
      • 2016-12-30
      • 2019-07-27
      • 2021-03-11
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      • 2022-01-24
      • 2020-04-13
      • 2014-02-04
      相关资源
      最近更新 更多