Google BigQuery:统计含匹配指定正则文本的唯一task_id数量
解决BigQuery统计符合条件的唯一task_id数量问题
首先明确需求:统计至少有一条text字段匹配纯字母正则表达式的唯一task_id数量。针对你的表数据,正确结果应为3(task_id=2、3、4)。
正确查询方法1:使用EXISTS子查询
这种方式直接检查每个task_id是否存在符合条件的记录,逻辑清晰:
SELECT COUNT(DISTINCT task_id) AS qualified_task_count FROM `<table_name>` t1 WHERE EXISTS ( SELECT 1 FROM `<table_name>` t2 WHERE t2.task_id = t1.task_id AND REGEXP_CONTAINS(t2.text, r"\\b[a-zA-Z]+\\b") )
说明:
REGEXP_CONTAINS用于判断字段是否匹配正则,比REGEXP_EXTRACT_ALL更适合“存在匹配”的场景- 正则中的
\b在BigQuery SQL里需要转义为\\b,否则会被解析为普通字符
正确查询方法2:分组后用HAVING过滤
通过分组task_id,统计每个分组内符合条件的记录数,再筛选出有至少1条符合条件的分组:
SELECT COUNT(*) AS qualified_task_count FROM ( SELECT task_id FROM `<table_name>` GROUP BY task_id HAVING COUNTIF(REGEXP_CONTAINS(text, r"\\b[a-zA-Z]+\\b")) >= 1 )
说明:
COUNTIF统计分组内满足正则匹配的记录数,只要数量≥1,该task_id就符合要求- 外层查询统计符合条件的分组数量,即唯一task_id的数量
你原查询的问题
- 子查询语法错误:
WHERE后不能直接返回多字段的子查询,且子查询未关联主表 - 未正确判断匹配:使用
REGEXP_EXTRACT_ALL返回的是匹配结果数组,无法直接作为条件 - 缺少分组逻辑:没有按
task_id分组来判断每个任务是否存在符合条件的记录
内容的提问来源于stack exchange,提问作者eng2019
相关产品推荐
相关产品推荐

