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错误.
如何纠正这种替代语法以产生与第一种语法相同的结果?
问题:
在 BigQuery、标准 SQL 中,如果我运行
SELECT *
FROM mytable
CROSS JOIN UNNEST(mytable.array)
Run Code Online (Sandbox Code Playgroud)
我可以确定生成的行顺序与数组顺序相同吗?
例子:
假设我有下表mytable:
Row | id | prediction
1 | abcd | [0.2, 0.5, 0.3]
Run Code Online (Sandbox Code Playgroud)
如果我运行SELECT * FROM mytable CROSS JOIN UNNEST(mytable.prediction),我可以确定行顺序与数组顺序相同吗?即结果表将始终是:
Row | id | unnested_prediction
1 | abcd | 0.2
2 | abcd | 0.5
3 | abcd | 0.3
Run Code Online (Sandbox Code Playgroud)
有关用例的更多背景信息(argmax):
我试图找到每行中数组的最大值(argmax)的数组索引,即0.5上面数组中的第二个元素()。因此,我的目标输出是这样的:
Row | id | argmax
1 | abcd | 2
Run Code Online (Sandbox Code Playgroud)
使用按值排序的窗口函数CROSS JOIN和查找argmax 的窗口函数,我可以使用一些测试数据来实现此目的。您可以使用以下查询进行验证:DENSE_RANKpredictionROW_NUMBER …