Jiv*_*van 4 sql google-analytics google-bigquery unnest
Google Analytics(分析)BigQuery表的结构如下(旧版SQL表示法 - 仅显示相关字段):
visitId: INTEGER
hits: RECORD/REPEATED
hits.hour: INTEGER
Run Code Online (Sandbox Code Playgroud)
在一个这样的表上,以下查询运行良好:
SELECT
visitId,
MIN(h.hour) AS firstHitHour
FROM
`my-table.ga_sessions_20161122`, UNNEST(hits) AS h
GROUP BY
visitId
Run Code Online (Sandbox Code Playgroud)
但是使用这种替代语法:
SELECT
visitId,
(SELECT MIN(hour) FROM UNNEST(hits)) as firstHitHour
FROM
`my-table.ga_sessions_20161122`
GROUP BY
visitId
Run Code Online (Sandbox Code Playgroud)
触发以下错误:
错误:UNNEST表达式引用既未分组也未聚合的列命中
我知道UNNEST(hits)必须以某种方式分组或聚合,但由于这个专栏是一个array (repeated),它究竟意味着什么?
如果我hits按照要求尝试"对列进行分组",如下所示:
(SELECT MIN(hour) FROM UNNEST(hits) as h GROUP BY h) as firstHitHour
Run Code Online (Sandbox Code Playgroud)
然后我收到一个Grouping by expressions of type STRUCT is not allowed错误.
如何纠正这种替代语法以产生与第一种语法相同的结果?
我的第一个答案是这个问题的原始版本.
当我回答时,我意识到你已将它改为完全不同的一个:o)
所以下面的答案是针对您问题的最新版本:
我认为在"替代"版本中你根本不需要GROUP BY,因为你逐行操作原始(非扁平化)和每行(visitId)你计算firstHitHour
SELECT
visitId,
(SELECT MIN(hour) FROM UNNEST(hits)) as firstHitHour
FROM
`my-table.ga_sessions_20161122`
Run Code Online (Sandbox Code Playgroud)
在您的初始查询中 - 您可以平滑每行的所有记录 - 这就是您需要将它们分组的原因
请尝试以下操作(它使用您原始问题中的示例):
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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8990 次 |
| 最近记录: |