You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

结果验证

基于你提供的测试数据:

  1. 明细查询返回结果完全符合预期:
NameBCsamedifferent
Arun1234-5678123410
Tara6789 - 7654678910
Arun4567432401
  1. 分组统计返回结果:
Namesame_cntdifferent_cnt
Arun11
Tara10

注:如果你的B、C字段本身已经是相同的字符串类型,可以去掉代码里的CAST(C AS STRING)转换逻辑,不影响结果。

内容的提问来源于stack exchange,提问作者Madness

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 12:24:58