将 flat table 转换为 nested/repeated table

Transform flat table into nested/repeated table

在 BigQuery 中,我们有一个 字典 tables,它指定了一些映射 - 例如:

但是这种结构(扁平的,通常是关系型结构)使用映射操作并不方便 - 当我们编写查询时,如果我们想获得几个字段的映射,则需要多个连接。我们的想法是 将字典 table 转换为具有重复字段的单行嵌套 table,以启用具有单个连接的映射应用程序。所以所需的结构如下所示:

知道如何通过标准 sql 将平面 table 转换为嵌套吗? 从本质上讲,field 属性的值应该变成一个新的属性,并且 key value 值对应该成为每个 attribute 的重复条目。所以整个操作类似于pivot。


P.S。 我知道,BigQuery 最近引入了一个 json 结构。我们考虑过此解决方案,但 JSON_QUERY 不支持将串联值传递给函数参数。结果我们无法动态获取值,我们放弃了这个解决方案,因为它更复杂。

您可以使用 pivot 运算符和 array_agg() 函数来实现此目的。

这是执行此操作的查询 -

with temp as 
(
    select 'aaa' as field, 1 key, 2 value union all
    select 'aaa' as field, 2 key, 5 value union all
    select 'aaa' as field, 4 key, 15 value union all
    select 'bbb' as field, 1 key, 23 value union all
    select 'bbb' as field, 2 key, 36 value
)

select * 
from 
(
select field, key, value
from temp
)
pivot
(
    array_agg(struct(key, value) ignore nulls) 
    for field in ('aaa','bbb')
)

在主元运算符中,如您所见,我将字段值提到为 aaa,bbb。如果你想动态加载它们,那么你需要设置一个变量,然后再做。

有关将值存储在变量中然后使用数据透视表的更多详细信息,请使用此 link - https://towardsdatascience.com/pivot-in-bigquery-4eefde28b3be

考虑下面的简单选项

select * from your_table pivot (
  array_agg(struct(key, value) ignore nulls) 
  for field in ('aaa','bbb')
)          

如果应用于您问题中的示例数据 - 输出为