假设这样的源表:
Year Long Lat Values
========================================
2015 8 1 12
2015 8 1 43
2015 8 1 11
...
命运表应如下所示:
Year Long Lat Field1 Field2 Field3
========================================================================
2015 8 1 12 43 11
...
¿我如何在单个查询(在Google BigQuery中使用)中执行类似的操作?
“问题”是我将在Python Google Dataflow管道中使用此查询,因此由于使用apache beam进行读取和写入的限制,我需要在一次选择中完成此操作(您可以取消insert语句,因为我将为此使用apache Beam函数)。
额外
使用此选择
select Fecha, Longitud, Latitud,
ARRAY_AGG(Valor) as vector
from `poc-cloud-209212.PruebasIoT.CanonicalFrames`
group by Fecha, Longitud, Latitud
如果我尝试使用:
select Fecha, Longitud, Latitud,
ARRAY_AGG(Valor)[offset(0)] as field1,
ARRAY_AGG(Valor)[offset(1)] as field2
from `poc-cloud-209212.PruebasIoT.CanonicalFrames`
group by Fecha, Longitud, Latitud
我有错误:
Array index 1 is out of bounds (overflow)
这对我的用例有效:
基于此帖子的表(可以包含更多行,其值与模式中显示的值不同)的简单查询可以更轻松地理解您的操作方式:
select year, long, lat,
array_agg(values)[SAFE_OFFSET(0)] as field1,
array_agg(values)[SAFE_OFFSET(1)] as field2,
array_agg(values)[SAFE_OFFSET(2)] as field3
from t
group by year, long, lat;
答案 0 :(得分:1)
您可以使用条件聚合。但是我认为更典型的方法是将字段放入数组:
select year, long, lat,
array_agg(values)
from t
group by year, long, lat;
请注意,不能保证结果的顺序。 SQL表表示无序集,并且您的数据没有指定顺序的列。
您可以轻松地将其扩展到字段:
select year, long, lat,
array_agg(values)[offset(0)] as field1,
array_agg(values)[offset(1)] as field2,
array_agg(values)[offset(2)] as field3
from t
group by year, long, lat;