【问题标题】:UNNEST expression references column which is neither grouped nor aggregatedUNNEST 表达式引用既不分组也不聚合的列
【发布时间】:2017-04-09 03:30:11
【问题描述】:

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 错误。

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

【问题讨论】:

    标签: sql google-analytics google-bigquery unnest


    【解决方案1】:

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

    所以下面的答案是你问题的最新版本:

    我认为在“替代”版本中,您根本不需要 GROUP BY,因为您逐行对原始(未展平)进行操作,并且为每一行(visitId)计算 firstHitHour

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

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

    【讨论】:

      【解决方案2】:

      试试下面(它使用你原来问题的例子):

      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-20
        • 1970-01-01
        • 1970-01-01
        • 2021-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-16
        相关资源
        最近更新 更多