UNNEST表达式引用既未分组也未聚合的列

时间:2016-11-24 18:51:12

标签: sql google-analytics google-bigquery unnest

Google Analytics BigQuery表的结构如下(旧版SQL表示法 - 仅显示相关字段):

visitId:                      INTEGER
hits:                         RECORD/REPEATED
hits.hour:                    INTEGER

在一个这样的表上,以下查询效果很好:

SELECT
  visitId,
  MIN(h.hour) AS firstHitHour
FROM
  `my-table.ga_sessions_20161122`, UNNEST(hits) AS h
GROUP BY
  visitId

但是使用这种替代语法:

SELECT
  visitId,
  (SELECT MIN(hour) FROM UNNEST(hits)) as firstHitHour
FROM
  `my-table.ga_sessions_20161122`
GROUP BY
  visitId

触发以下错误:

  

错误:UNNEST表达式引用既未分组也未汇总的列匹配

我了解UNNEST(hits)必须以某种方式进行分组或汇总,但由于此列为array (repeated),这究竟是什么意思?

如果我尝试按照要求对hits"列进行分组,请执行以下操作:

(SELECT MIN(hour) FROM UNNEST(hits) as h GROUP BY h) as firstHitHour

然后我收到Grouping by expressions of type STRUCT is not allowed错误。

如何更正此替代语法以产生与第一个相同的结果?

2 个答案:

答案 0 :(得分:8)

我的第一个答案是这个问题的原始版本 当我回答时,我意识到你已将它改为完全不同的一个:o)

以下答案适用于您问题的最新版本:

我认为在“替代”版本中你根本不需要GROUP BY,因为你逐行操作原始(非展平)和每行(visitId)你计算firstHitHour

SELECT
  visitId,
  (SELECT MIN(hour) FROM UNNEST(hits)) as firstHitHour
FROM
  `my-table.ga_sessions_20161122`

在您的初始查询中 - 您将每行的所有记录展平 - 这就是您需要将它们分组的原因

答案 1 :(得分:4)

尝试下面(它使用原始问题中的示例):

SELECT
  visitId, source, medium, browser,
  MIN(hour) AS firstHitHour,
  LOGICAL_OR(hasValue) AS hasValue
FROM (
  SELECT
    visitId,
    trafficSource.source AS source,
    trafficSource.medium AS medium,
    device.browser AS browser,
    h.hour AS hour,
    EXISTS(SELECT 1 FROM UNNEST(hits) WHERE eventInfo.eventCategory = "SomeValue") AS hasValue
  FROM
   `my-table.ga_sessions_20161122`, UNNEST(hits) AS h
)
GROUP BY
visitId, source, medium, browser;