Google bigquery 在BigQuery中,如何在json上筛选某些子元素之和为正的行?

Google bigquery 在BigQuery中,如何在json上筛选某些子元素之和为正的行?,google-bigquery,Google Bigquery,跟进 最终你会得到这样的结果: 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}] 如何使用StandardSQL进一

跟进 最终你会得到这样的结果:

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

如何使用StandardSQL进一步筛选sum(与所有键匹配)>0的行?

为了保持简单,只需在引用查询的末尾添加下一行即可

HAVING SUM(ARRAY_LENGTH(REGEXP_EXTRACT_ALL(str, CONCAT(key, r'[^\s]')))) > 0   
因此,最终的查询(BigQuery标准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}]   

注意:我在虚拟数据中又添加了一行,并将其从输出中过滤掉,因为该行中根本没有匹配项

为了保持简单,只需将下面的行添加到引用查询的末尾即可

HAVING SUM(ARRAY_LENGTH(REGEXP_EXTRACT_ALL(str, CONCAT(key, r'[^\s]')))) > 0   
因此,最终的查询(BigQuery标准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}]   

注意:我在虚拟数据中又添加了一行,并将其从输出中过滤掉,因为该行中根本没有匹配项

如果您不想吐出匹配项为零的键,该怎么办?您应该发布包含所有相关详细信息的新问题。同时-请-自己先试试-否则看起来你是在外包你的工作/家庭作业。我们很乐意提供帮助,但首先展示您的尝试:o)提示:这非常容易!是的,对不起-我只是想得太快了-我相信有很多方法可以做到-我使用了javascript UDF和JSON.parse/stringify+数组过滤器,就因为我刚刚了解到,你甚至可以拥有我提到的javascript UDFA-这很容易-因此没有UDF参与:o)-只要尝试-如果仍然存在问题-发布新问题如果你不想吐出零匹配的键怎么办?你应该发布你的新问题以及所有相关细节。同时-请-自己先试试-否则看起来你是在外包你的工作/家庭作业。我们很乐意提供帮助,但首先展示您的尝试:o)提示:这非常容易!是的,对不起-我只是想得太快了-我肯定有很多方法可以做到-我玩了javascript UDF和JSON.parse/stringify+array过滤器,因为我刚刚了解到你甚至可以拥有我提到的javascript UDFA-这很简单-所以没有UDF参与:o)-只要尝试-如果仍然有问题-发布新问题