相关疑难解决方法(0)

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

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

sql google-analytics google-bigquery unnest

4
推荐指数
2
解决办法
8990
查看次数

BigQuery argmax:执行 CROSS JOIN UNNEST 时是否保持数组顺序

问题:

在 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 …

arrays cross-join google-bigquery argmax

3
推荐指数
1
解决办法
3703
查看次数