Создайте вложенную таблицу из таблицы заголовка и сведений

# #google-bigquery #nested-table

Вопрос:

Я хотел бы создать вложенную таблицу с данными заказа. У меня есть таблицы orders и order_details. Ключ-order_id. Когда я явно пишу имена полей, это работает нормально, но в моих таблицах по 20 полей в каждой. Есть ли способ выбрать все поля?

Это то, что я делаю сейчас (пример с несколькими полями):

 with orders as(
    select
        order_id
        ,order_date
        ,store
    from `orders`
)
, order_details as(
    select 
        order_id
        ,order_date
        ,product_id
        ,amount
    from `order_details`
)
select 
   orders.order_id
   ,orders.order_date
   ,orders.store
   ,array_agg(struct(order_details.product_id,order_details.amount)) as order_details
from orders
   left join order_details using(order_id)
group by 1,2,3
 

Я хотел бы сделать что-то подобное:

 with orders as(
    select
        *
    from `orders`
)
, order_details as(
    select 
        *
    from `order_details`
)
select 
   orders.*
   ,array_agg(struct(select order_details.*) as order_details
from orders
   left join order_details using(order_id)
group by 1,2,3,4,5.........................
 

Есть какие-нибудь предложения, как это сделать? Группировка должна будет включать все поля из таблицы заказов. Есть ли способ сделать это лучше?

Ответ №1:

Рассмотрим следующий подход — делает именно то, что вы просите

 select 
  any_value(o).*,
  array_agg(d) as order_details
from orders o
left join order_details d
using(order_id)
group by to_json_string(o)
 

Комментарии:

1. Последующий вопрос по этому поводу. Я читал документы и тестировал, чтобы понять, что здесь происходит. Почему в функции array_agg нет «структуры»?

2. d уже является структурой, поэтому вот почему :o)