Каков эквивалент ARRAY_AGG(foo where bar) в BigQuery?

#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