【问题标题】:Group rows to one将行分组为一个
【发布时间】:2018-12-04 11:06:49
【问题描述】:

假设有这样一个源表:

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 中使用)?

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

“问题”是我将在 Python Google Dataflow 管道中使用此查询,因此由于使用 apache 光束的读写限制,我需要在单个选择中执行此操作(您可以避免插入语句,因为我将为此使用 apache 光束功能)。

额外

使用这个选择

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;

【问题讨论】:

  • 这个输出的逻辑是什么?
  • 我想你想使用 PIVOT。参照。 stackoverflow.com/a/10429399/6996150 PS:我喜欢¿这个角色!
  • 您使用的是什么 DBMS?
  • 像“DBMS”一样,我正在使用 Google BigQuery,它使用标准 SQL。逻辑是从接收“原始”数据的表中读取,它们必须以“规范”方式存储
  • lat = 2 去哪儿了?

标签: sql google-bigquery


【解决方案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;

【讨论】:

  • 谢谢你,戈登。我在主帖中添加了一些信息,其中包含您的第一个选项的结果。第二个选项我有错误
  • 使用SAFE_OFFSET() 而不是OFFSET()
  • 冷却使用 SAFE_OFFSET。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 2020-01-04
  • 2022-01-22
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多