Как получить количество совпадений в поле таблицы для списка фраз из другой таблицы в большом запросе? - PullRequest
0 голосов
/ 07 марта 2019

Учитывая произвольный список фраз: фраза1, фраза2 *, ... фразаN (скажем, они находятся в другой таблице Phrase_Table), как можно получить количество совпадений для каждой фразы в поле F в таблице больших запросов?

Здесь "*" означает, что после фразы должна быть какая-то непустая / непустая строка.

Допустим, у вас есть таблица с полем и ID и два строковых поля Field1, Field2

Вывод будет выглядеть примерно так:

id, CountOfPhrase1InField1, CountOfPhrase2InField1, CountOfPhrase1InField2, CountOfPhrase2InField2

или, как я полагаю, вместо всех этих полей вывода может быть одно поле объекта json

*

id, [{"fieldName": Field1, "counts": {фраза1: m, фраза2: mm, ...}, {"fieldName": Field2, "counts": {фраза1: м2, фраза2:мм2, ...}, ...]

Спасибо!

1 Ответ

1 голос
/ 07 марта 2019

Ниже приведен пример для BigQuery Standard SQL

#standardSQL
WITH `project.dataset.table` AS (
SELECT 'foo1 foo foo40' str UNION ALL
SELECT 'test1 test test2 test'
), `project.dataset.keywords` AS (
  SELECT 'foo' key UNION ALL
  SELECT 'test'
)
SELECT str, 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

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

Row str                     all_matches.key all_matches.matches  
1   foo1 foo foo40          foo             2    
                            test            0    
2   test1 test test2 test   foo             0    
                            test            2    

Если вы предпочитаете вывод в качестве json, вы можете добавить TO_JSON_STRING (), как в примере ниже

#standardSQL
WITH `project.dataset.table` AS (
SELECT 'foo1 foo foo40' str UNION ALL
SELECT 'test1 test test2 test'
), `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

с выводом

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}]     

Есть бесконечные способы представления результатов, как указано выше - надеюсь, вы настроите его так, как вам нужно: o)

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