BigQuery SQL两表关联:分组列取全量去重值 未匹配列补NULL
BigQuery非唯一键多表关联去重实现思路
核心实现逻辑分三步,不需要复杂的多轮UNION,也不会出现交叉连接重复:
- 第一步构建全维度基准CTE:分别从两张表提取所有
(Date/Key, Group Column)的组合,用UNION DISTINCT去重,得到两表所有出现过的「日期+分组」全量组合,这一步是最终结果不会丢任何独有分组值的基础,注意不要漏了日期维度,仅提取分组列会导致跨日期错误匹配。 - 第二步单表预聚合消除内部重复:分别对Table1、Table2按
(Date/Key, Group Column)做聚合,把同日期同分组下的度量值按业务规则提前计算(比如求和、取首值等),确保单表内一个「日期+分组」组合只对应一行数据,从根源避免JOIN时产生笛卡尔积重复。 - 第三步基准表左连两表取数:用第一步生成的全维度基准表作为主表,分别左连接第二步预聚合后的Table1、Table2,关联条件同时命中日期键和分组列,未匹配到的度量列会自动填充为NULL,完全符合预期结果要求。按照样例数据逻辑,最终会保留01-01-2022下a、b、c、d、e、f全部分组值,各度量列匹配规则完全满足需求。
对你现有CTE方案的问题提示
你当前的方案存在两个明显缺陷:
- 基准集合只提取了分组列,没有纳入日期关联键,会出现不同日期下分组值错误匹配的问题
- 主查询以Table1为驱动表,会直接丢失Table2独有的分组值(比如样例中的b、c),无法满足保留两表所有分组值的要求
你提供的现有参考代码:
list as(Select t1.GroupColumn FROM Table_1 t1 WHERE CONDITION1 UNION DISTINCT Select t1.GroupColumn FROM Table_1 t1 WHERE CONDITION2 ... ect) result as ( SELECT l.GoupColumn, t1.Example_Value1, t2.Example_Value2 FROM Table_1 t1 LEFT JOIN( SELECT * FROM list) s ON S.GroupColumn = t1.GroupColumn LEFT JOIN Table_2 t2 on S.GroupColumn = t2.GroupColumn and t1.key = t2.key ... ) SELECT * FROM result
内容的提问来源于stack exchange,提问作者suki suki
相关产品推荐
相关产品推荐

