В BigQuery, как фильтровать по JSON для строк, где сумма некоторых подэлементов положительна? - PullRequest
0 голосов
/ 08 марта 2019

Отслеживание Как получить количество совпадений в поле таблицы для списка фраз из другой таблицы в большом запросе? Где вы в конечном итоге что-то вроде:

Row str                     all_matches  
1   foo1 foo foo40          [{"key":"foo","matches":2},{"key":"test","matches":0}]   
2   test1 test test2 test   [{"key":"foo","matches":0},{"key":"test","matches":2}]     

Как вы могли бы далее фильтровать те строки, для которых сумма (совпадает по всем ключам)> 0 с StandardSQL?

1 Ответ

2 голосов
/ 08 марта 2019

Для простоты - просто добавьте нижнюю строку в конец ссылочного запроса

HAVING SUM(ARRAY_LENGTH(REGEXP_EXTRACT_ALL(str, CONCAT(key, r'[^\s]')))) > 0   

Итак, итоговый запрос (BigQuery Standard SQL) будет

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'foo1 foo foo40' str UNION ALL
  SELECT 'test1 test test2 test' UNION ALL
  SELECT 'abc xyz'
), `project.dataset.keywords` AS (
  SELECT 'foo' key UNION ALL
  SELECT 'test'
)
SELECT str, 
  TO_JSON_STRING(ARRAY_AGG(STRUCT(key, ARRAY_LENGTH(REGEXP_EXTRACT_ALL(str, CONCAT(key, r'[^\s]'))) AS matches))) all_matches
FROM `project.dataset.table` 
CROSS JOIN `project.dataset.keywords`
GROUP BY str
HAVING SUM(ARRAY_LENGTH(REGEXP_EXTRACT_ALL(str, CONCAT(key, r'[^\s]')))) > 0

с результатом

Row str                     all_matches  
1   foo1 foo foo40          [{"key":"foo","matches":2},{"key":"test","matches":0}]   
2   test1 test test2 test   [{"key":"foo","matches":0},{"key":"test","matches":2}]   

Примечание. Я добавил еще одну строку в фиктивные данные, и она отфильтровывается из выходных данных, поскольку в этой строке вообще нет совпадений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...