Я создаю ваши образцы данных также двумя способами, так как не уверен, является ли поставщик массивом или нет. От чего у вас могут возникнуть осложнения.
Первым примером поставщика является массив
#standardSQL
WITH `yourTable` AS (
select 111 as id, (select
array(select
struct(array(select struct('A' as label, 0.1 as score,2 as position)
union all select struct('B' as label, 0.9 as score,5 as position)
union all select struct('C' as label, 0.9 as score,8 as position)
) as topic,
array(select struct('Cat1' as label, 0.8 as score)
union all select struct('Cat2' as label, 0.3 as score)
) as categories
)
)) as vendor
union all
select 222 as id, (select
array(select
struct(array(select struct('X' as label, 0.3 as score,2 as position)
union all select struct('Y' as label, 0.9 as score,3 as position)
) as topic,
array(select struct('Cat33' as label, 0.9 as score)
union all select struct('Cat99' as label, 0.4 as score)
union all select struct('Cat44' as label, 0.85 as score)
) as categories
)
)) as vendor
)
------
SELECT id,array(
select struct(
(select array_agg(t) as topic from unnest(vendor),unnest(topic) t where t.score>=0.8) as topic,
(select array_agg(t) as categories from unnest(vendor),unnest(categories) t where t.score>=0.8) as categories
)
) as vendor2 from yourTable
Возвращает:
![enter image description here](https://i.stack.imgur.com/dDTVD.png)
В основном, как вам нужно прочитать это: - вы выбираете строку с id
и vendor2
- по природе vendor2
является массивом (пропустите это для второго примера) - тогда вам нужны два ключа как struct topic
и categories
- topic
или categories
являются массивом структур.
2-й пример (где vendor не является массивом):
#standardSQL
WITH `yourTable` AS (
select 111 as id, (select
struct(array(select struct('A' as label, 0.1 as score,2 as position)
union all select struct('B' as label, 0.9 as score,5 as position)
union all select struct('C' as label, 0.9 as score,8 as position)
) as topic,
array(select struct('Cat1' as label, 0.8 as score)
union all select struct('Cat2' as label, 0.3 as score)
) as categories
)
) as vendor
union all
select 222 as id, (select
struct(array(select struct('X' as label, 0.3 as score,2 as position)
union all select struct('Y' as label, 0.9 as score,3 as position)
) as topic,
array(select struct('Cat33' as label, 0.9 as score)
union all select struct('Cat99' as label, 0.4 as score)
union all select struct('Cat44' as label, 0.85 as score)
) as categories
)
) as vendor
)
SELECT id,struct(
(select array_agg(t) as topic from unnest(vendor.topic) t where t.score>=0.8) as topic,
(select array_agg(t) as categories from unnest(vendor.categories) t where t.score>=0.8) as categories
) as vendor2 from yourTable