BigQuery 相关子查询 - 将数组转换为数组

Posted

技术标签:

【中文标题】BigQuery 相关子查询 - 将数组转换为数组【英文标题】:BigQuery correlated subqueries - transform array to array 【发布时间】:2021-06-14 12:21:02 【问题描述】:

我正在尝试在 BigQuery 中加入数组元素,但收到以下错误消息:

不支持引用其他表的相关子查询 除非它们可以去相关,例如通过将它们转换为 高效的 JOIN。

在我的第一张桌子上,我有类似的东西:

字段1 |字段2 |一些列表

some_list 中的元素具有 id 和其他数据,我想用不同表中的一些字段(它们可能存在或不存在)来丰富 some_list 中的每个元素。 我尝试取消嵌套 some_list 并在 id 上使用不同的表离开 join,但似乎不允许这样做。

任何想法我该怎么做?谢谢!

第一个表:

day             city       orders.id    orders.address
14-06-2021      London      1            abc
                            2            def
                            3            ghi
14-06-2021      Bristol     4            sfd
                            5            sds

第二张桌子:

order.id    order.weight
1            10
2            12
3            35
5            31

预期结果:

day            city     orders.id    orders.address  orders.weight
14-06-2021     London    1           abc            10
                         2           def            12
                         3           ghi            35
14-06-2021     Bristol   4           sfd            NULL
                         5           sds            31

【问题讨论】:

样本数据和期望的结果会有所帮助。 好的,我会更新我原来的问题 【参考方案1】:

考虑以下通用解决方案

select any_value(t1).* replace(
    array_agg((select as struct t.*, `order`.weight)) as orders
  )
from first_table t1, t1.orders t
left join second_table t2
on id = `order`.id  
group by to_json_string(t1)    

如果应用于您问题中的样本数据 - 输出是

【讨论】:

【参考方案2】:

试试这个:

with first_table as (
  select '14-06-2021' as day, 'London' as city, [struct(1 as id, 'abc' as address), (2, 'def'), (3, 'ghi')] as orders union all
  select '14-06-2021' as day, 'Bristol' as city, [struct(4 as id, 'sfd' as address), (5, 'sds')] as orders
),
second_table as (
  select struct(1 as id, 10 as weight) as `order` union all
  select struct(2 as id, 12 as weight) as `order` union all
  select struct(3 as id, 35 as weight) as `order` union all
  select struct(5 as id, 31 as weight) as `order`
  
)
select day, city, array_agg(struct(o.id as id, o.address as address, s.order.weight as weight)) as orders
from first_table, unnest(orders) as o left join second_table as s on o.id = s.order.id
group by day, city

【讨论】:

它也能完成这项工作,谢谢!但实际上我的 first_table 有更多列,我不确定按所有列分组是否是一个不错的解决方案。【参考方案3】:

这应该可以正常工作,并且似乎符合您的描述:

select t.*,
       (select array_agg(coalesce(ot.other_value, el))
        from unnest(t.some_list) el left join
             othertable ot
             on ot.key = el.key
       ) as new_list
from t;

【讨论】:

以上是关于BigQuery 相关子查询 - 将数组转换为数组的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery - 联合上的相关子查询不起作用

标准 SQL 中的 BigQuery 连接数组

BigQuery 中使用引用另一个表的 UDF 的相关子查询错误

将查询构建器条件转换为 MongoDB 操作,包括嵌套的子文档数组

在 Bigquery 中,如何将结构的字符串化数组转换为正确的数组?

BigQuery:将数组中的键值对转换为列