Как отфильтровать значения столбцов по списку строк

Я пытаюсь отфильтровать набор данных, сравнивая список строк со значениями столбцов.

Это хорошо работает с LIKE и одной строкой, используя 3 ГБ.

#standardSQL

SELECT substr(CAST((DATE) AS STRING),0,8) as daydate,
count(1) as count,
avg(CAST(REGEXP_REPLACE(V2Tone, r',.*', "")AS FLOAT64)) tone,
avg(SAFE_CAST(REGEXP_EXTRACT(GCAM, r'c1.3:(\d+)') as FLOAT64)) anew,
sum(SAFE_CAST(REGEXP_EXTRACT(GCAM, r'c12.1:(\d+)') as FLOAT64)) 
ridanxietycnt, 
sum(SAFE_CAST(REGEXP_EXTRACT(GCAM, r'wc:(\d+)') as FLOAT64)) wordcount   
FROM `gdelt-bq.gdeltv2.gkg_partitioned` t
where _PARTITIONTIME BETWEEN TIMESTAMP('2019-02-02') AND TIMESTAMP('2019- 
02-02') 
AND V2Themes LIKE 'ECON_INFLATION'

group by daydate

Однако при использовании более одной строки с "LIKE" запрос внезапно становится очень большим (8 ТБ).

#standardSQL

SELECT substr(CAST((DATE) AS STRING),0,8) as daydate,
count(1) as count,
avg(CAST(REGEXP_REPLACE(V2Tone, r',.*', "")AS FLOAT64)) tone,
avg(SAFE_CAST(REGEXP_EXTRACT(GCAM, r'c1.3:(\d+)') as FLOAT64)) anew,
sum(SAFE_CAST(REGEXP_EXTRACT(GCAM, r'c12.1:(\d+)') as FLOAT64)) 
ridanxietycnt, 
sum(SAFE_CAST(REGEXP_EXTRACT(GCAM, r'wc:(\d+)') as FLOAT64)) wordcount   
FROM `gdelt-bq.gdeltv2.gkg_partitioned` t
where _PARTITIONTIME BETWEEN TIMESTAMP('2019-02-02') AND TIMESTAMP('2019- 
02-02') 
AND V2Themes LIKE 'ECON_INFLATION' OR V2Themes LIKE 'ECON_STOCKMARKET'
group by daydate

Есть ли более эффективный (и дешевый) способ сравнить значения столбцов со списком строк? Любые идеи будут очень признательны.

1 ответ

Решение

Осторожно с логикой и OR приоритет.

Эта:

WHERE _PARTITIONTIME BETWEEN TIMESTAMP('2019-02-02') AND TIMESTAMP('2019-02-02') 
AND V2Themes LIKE 'ECON_INFLATION' 
OR V2Themes LIKE 'ECON_STOCKMARKET'

не то же самое, что:

WHERE _PARTITIONTIME BETWEEN TIMESTAMP('2019-02-02') AND TIMESTAMP('2019-02-02') 
AND (
  V2Themes LIKE 'ECON_INFLATION' 
  OR V2Themes LIKE 'ECON_STOCKMARKET'
)

Первый не фильтрует разделение, а второй -.

Другие вопросы по тегам