[英]Array column and aggregation in BigQuery SQL: Why the values are not all aggregated?
我在BigQuery中执行了下面的代码
SELECT ( --inner query
SELECT STRING_AGG(c) FROM t1.array_column c
)
FROM (
select 1 as f1, ['1','2','3'] as array_column
union all
select 2 as f1, ['5','6','7'] as array_column
) t1;
我期待类似的东西
Row|f0_
1 | 1,2,3,4,5,6,7
因为内部查询中没有GROUP BY
。 所以,我期待在所有线路上评估STRING_AGG
。
SELECT STRING_AGG(c) FROM t1.array_column c
相反,我得到这样的东西:
Row|f0_
1 |1,2,3
2 |5,6,7
我有麻烦理解为什么我有这个结果
以下是BigQuery Standard SQL
#standardSQL
SELECT STRING_AGG((SELECT STRING_AGG(c) FROM t1.array_column c))
FROM (
SELECT 1 AS f1, ['1','2','3'] AS array_column UNION ALL
SELECT 2 AS f1, ['5','6','7'] AS array_column
) t1
并生产
Row f0_
1 1,2,3,5,6,7
注1:你几乎就在那里 - 你只是缺少额外的STRING_AGG
,它会对每行中各自数组创建的字符串进行最后的分组
注意2:因为array_column
属于ARRAY类型,所以它被视为内部表,引用为t1.array_column
,因为 - FROM t1.array_column c
相当于FROM UNNEST(array_column) c
- 非常酷的hidden
功能:o)
这是您的查询:
SELECT (SELECT STRING_AGG(c) FROM t1.array_column c
)
FROM (select 1 as f1, ['1', '2', '3'] as array_column
union all
select 2 as f1, ['5', '6', '7'] as array_column
) t1;
首先,我很惊讶它有效。 我以为你需要unnest()
:
SELECT (SELECT STRING_AGG(c) FROM UNNEST(t1.array_column) c
)
怎么了? 好吧,如果你选择f1
,这将更加明显。 然后你会得到:
1 1,2,3
2 5,6,7
这应该更清楚。 对于t1
每一行(并且有两行),您的代码是:
c
的列将数组排除在行之外。 如果要组合数组中的元素,请使用array_concat_agg()
:
SELECT array_concat_agg(array_column)
FROM (select 1 as f1, ['1','2','3'] as array_column
union all
select 2 as f1, ['5','6','7'] as array_column
) t1;
如果您希望将其表示为字符串而不是数组,请使用array_to_string()
:
SELECT array_to_string(array_concat_agg(array_column), ',')
FROM (select 1 as f1, ['1','2','3'] as array_column
union all
select 2 as f1, ['5','6','7'] as array_column
) t1;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.