# #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)
с выводом, который объединяет геоинформацию этих двух округов и визуализируется, как показано ниже