#google-bigquery
#google-bigquery
Вопрос:
Допустим, я хочу сделать это:
with source_data as (
select 1 as id, 'a' as sub_id, true as turned_on
union all
select 1 as id, 'b' as sub_id, true as turned_on
union all
select 2 as id, 'a' as sub_id, false as turned_on
union all
select 2 as id, 'b' as sub_id, true as turned_on
union all
select 3 as id, 'a' as sub_id, false as turned_on
union all
select 3 as id, 'b' as sub_id, false as turned_on
)
select
id,
array_agg(sub_id where turned_on) as all_on, -- invalid syntax
turned_off(sub_id where turned_off) as all_off -- invalid syntax
from
source_data
group by id
чтобы получить что-то вроде
| id | all_on | all_off |
| --- | ------ | ------- |
| 1 | [a, b] | |
| 2 | [b] | [a] |
| 3 | | [a, b] |
помеченные строки недопустимы, потому что я не могу этого сделать ARRAY_AGG(... where ...)
. Из документов, которые я собираю, я, вероятно, мог бы выполнить что-то подобное, используя аналитические функции (в частности PARTITION BY
), но я не понимаю, как.
Возможно ли написать запрос, который объединяет массивы так, как я проиллюстрировал выше? Как мне это сделать?
Ответ №1:
Рассмотрите возможность использования if
:
with source_data as (
select 1 as id, 'a' as sub_id, true as turned_on
union all
select 1 as id, 'b' as sub_id, true as turned_on
union all
select 2 as id, 'a' as sub_id, false as turned_on
union all
select 2 as id, 'b' as sub_id, true as turned_on
union all
select 3 as id, 'a' as sub_id, false as turned_on
union all
select 3 as id, 'b' as sub_id, false as turned_on
)
select
id,
array_agg(if(turned_on=true, sub_id, null) ignore nulls) as all_on,
array_agg(if(turned_on=false, sub_id, null) ignore nulls) as all_off
from
source_data
group by id