Фильтрация строк в bigquery на основе пользовательских параметров

# #sql #google-bigquery

Вопрос:

У меня есть следующая примерная таблица:

Информация Округ Государство
информация 1 Сонома Калифорния
информация 2 Фресно Калифорния
информация 3 Озеро Калифорния
информация 5 Озеро Флорида

Мне нужно выбрать, скажем, округ Сонома из Калифорнии и округ Лейк из Флориды. Мне нужно передать необходимые округа и необходимые штаты в качестве параметров списка, чтобы их можно было использовать в качестве аргументов для сценария.

 SELECT
    ST_UNION_AGG(Info) as counties_info
  FROM
    `project.dataset.table`
  WHERE
    County IN UNNEST(@counties) AND
    State IN UNNEST(@states)
 

Этот запрос также даст мне округ Лейк в Калифорнии, как мне изменить сценарий, все еще используя необходимые параметры списка [ @counties и @states ]?

ПРИМЕЧАНИЕ: Я не могу проверить отдельные состояния, так как @states параметры могут содержать любое состояние.

Ответ №1:

Я бы рекомендовал использовать структуры для параметров:

 SELECT ST_UNION_AGG(t.Info) as counties_info
FROM `project.dataset.table` t
WHERE EXISTS (SELECT 1
              FROM UNNEST(@county_states) cs
              WHERE cs.county = t.county AND cs.state = t.state
             );
 

Ответ №2:

Вы можете просто использовать

 select ...
from `project.dataset.table`
where (State, County) in unnest(@state_county_pairs)   
 

выше предполагается, что ваш @state_county_pairs параметр представляет собой массив пар sate, округов — как в приведенном ниже сценарии

 declare state_county_pairs array<struct<State string, Country string>> ;
set state_county_pairs =  [
  struct('California' as State, 'Sonoma' as County),
  struct('Florida', 'Lake')
];

select *
from `project.dataset.table`
where (State, County) in unnest(state_county_pairs)    
 

с выводом (если применимо к образцам данных в вашем вопросе)

введите описание изображения здесь

Очевидно, что тогда вы можете выполнять любую агрегацию или другую логику, которая вам нужна
, я не использую вашу ST_UNION_AGG(Info) as counties_info , потому что нет смысла иметь в виду представленные значения Info поля, но я надеюсь, что это было просто в целях упрощения, поэтому я использую только select * здесь

Тем временем, ниже приведен пример использования реальных данных с типом гео данных, который применим для использования с функциями ST_

 select st_union_agg(county_geom) as counties_geo
from `bigquery-public-data.utility_us.us_county_area`
join `bigquery-public-data.utility_us.us_states_area`
using (state_fips_code)
where (state_name, county_name) in unnest(@var_state_county_pairs)
 

с выводом, который объединяет геоинформацию этих двух округов и визуализируется, как показано ниже

введите описание изображения здесь