SQL实现按规则对比两列值并按Name分组统计匹配情况
GCP BigQuery 字段规则匹配与分组统计实现方案
原有代码问题说明
- 未实现B字段的规则截取逻辑,直接拿原始B值和C比对不符合需求
- 聚合逻辑错误:
COUNT()会统计所有非空值,无法单独统计值为1的条数;且同一SELECT中同时查询明细字段和聚合函数、未写GROUP BY会返回语法错误或不符合预期的结果 - 未做类型兼容处理,若B为字符串类型、C为数值类型直接比对会出现类型不匹配问题
核心实现逻辑
- B字段截取:按
-拆分B字段值,取拆分后的第一个片段,自动去除片段前后的空格,兼容带空格横杠、无横杠的所有场景 - 标记字段计算:用截取后的B值和C值(统一转字符串避免类型问题)比对,相等则
same=1、different=0,反之same=0、different=1 - 用CTE提前计算好比对值和标记字段,分别输出明细结果、分组统计结果,避免粒度冲突
可直接运行的代码
WITH base_process AS ( SELECT Name, B, C, -- 提取B字段用于比对的核心片段 TRIM(SPLIT(B, '-')[OFFSET(0)]) AS b_compare_val FROM `你的项目名.你的数据集名.Table` -- 替换成实际的表路径 ) -- ------------ 需求1:返回明细结果 ------------ SELECT Name, B, C, IF(b_compare_val = CAST(C AS STRING), 1, 0) AS same, IF(b_compare_val != CAST(C AS STRING), 1, 0) AS different FROM base_process; -- ------------ 需求2:按Name分组统计 ------------ -- 如果需要统计结果,注释掉上面的明细查询,运行下面这段即可 -- SELECT -- Name, -- SUM(IF(b_compare_val = CAST(C AS STRING), 1, 0)) AS same_cnt, -- SUM(IF(b_compare_val != CAST(C AS STRING), 1, 0)) AS different_cnt -- FROM base_process -- GROUP BY Name;
结果验证
基于你提供的测试数据:
- 明细查询返回结果完全符合预期:
| Name | B | C | same | different |
|---|---|---|---|---|
| Arun | 1234-5678 | 1234 | 1 | 0 |
| Tara | 6789 - 7654 | 6789 | 1 | 0 |
| Arun | 4567 | 4324 | 0 | 1 |
- 分组统计返回结果:
| Name | same_cnt | different_cnt |
|---|---|---|
| Arun | 1 | 1 |
| Tara | 1 | 0 |
注:如果你的B、C字段本身已经是相同的字符串类型,可以去掉代码里的
CAST(C AS STRING)转换逻辑,不影响结果。
内容的提问来源于stack exchange,提问作者Madness
相关产品推荐
相关产品推荐

