将行分组为一个

时间:2018-12-04 11:06:49

标签: sql google-bigquery

假设这样的源表:

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中使用)中执行类似的操作?

这些帖子可能是我想要的一种方法:post1 post2

“问题”是我将在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

Sample1

如果我尝试使用:

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;

1 个答案:

答案 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;