UNNEST 表达式引用既未分组也未聚合的列
UNNEST expression references column which is neither grouped nor aggregated
Google Analytics BigQuery table 的结构如下(旧版 SQL 表示法 - 仅显示相关字段):
visitId: INTEGER
hits: RECORD/REPEATED
hits.hour: INTEGER
在这样的 table 上,以下查询运行良好:
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
触发以下错误:
Error: UNNEST expression references column hits which is neither grouped nor aggregated
我知道 UNNEST(hits)
必须以某种方式分组或聚合,但由于此列是 array (repeated)
,它到底是什么意思?
如果我按照要求尝试 "group the column hits
",像这样:
(SELECT MIN(hour) FROM UNNEST(hits) as h GROUP BY h) as firstHitHour
然后我得到一个 Grouping by expressions of type STRUCT is not allowed
错误。
如何更正此替代语法以产生与第一个语法相同的结果?
尝试以下(它使用您原始问题中的示例):
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;
我的第一个答案是这个问题的原始版本。
当我回答时,我意识到你已经把它改成了完全不同的 :o)
下面的答案是针对您问题的最新版本:
我认为在 "alternative" 版本中,您根本不需要 GROUP BY,因为您逐行对原始(未展平)进行操作,并且对于每一行 (visitId) 计算 firstHitHour
SELECT
visitId,
(SELECT MIN(hour) FROM UNNEST(hits)) as firstHitHour
FROM
`my-table.ga_sessions_20161122`
在您的初始查询中 - 您将每一行的所有记录展平 - 所以这就是为什么您需要将它们重新分组的原因
Google Analytics BigQuery table 的结构如下(旧版 SQL 表示法 - 仅显示相关字段):
visitId: INTEGER
hits: RECORD/REPEATED
hits.hour: INTEGER
在这样的 table 上,以下查询运行良好:
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
触发以下错误:
Error: UNNEST expression references column hits which is neither grouped nor aggregated
我知道 UNNEST(hits)
必须以某种方式分组或聚合,但由于此列是 array (repeated)
,它到底是什么意思?
如果我按照要求尝试 "group the column hits
",像这样:
(SELECT MIN(hour) FROM UNNEST(hits) as h GROUP BY h) as firstHitHour
然后我得到一个 Grouping by expressions of type STRUCT is not allowed
错误。
如何更正此替代语法以产生与第一个语法相同的结果?
尝试以下(它使用您原始问题中的示例):
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;
我的第一个答案是这个问题的原始版本。
当我回答时,我意识到你已经把它改成了完全不同的 :o)
下面的答案是针对您问题的最新版本:
我认为在 "alternative" 版本中,您根本不需要 GROUP BY,因为您逐行对原始(未展平)进行操作,并且对于每一行 (visitId) 计算 firstHitHour
SELECT
visitId,
(SELECT MIN(hour) FROM UNNEST(hits)) as firstHitHour
FROM
`my-table.ga_sessions_20161122`
在您的初始查询中 - 您将每一行的所有记录展平 - 所以这就是为什么您需要将它们重新分组的原因