BigQuery中Left Join时重复id2仅匹配左表单行的实现方案问询
在BigQuery中实现Left Join时仅匹配右表重复id2的单行数据
要实现你说的需求,核心是先对右表的重复id2做去重处理,再和左表做Left Join,这样左表每一行只会匹配到右表的一行数据(即便右表有多个相同id2)。下面给你两种在BigQuery里可行的实现方式:
方法1:用DISTINCT快速去重
如果右表中同一id2对应的其他字段值完全一致,直接用DISTINCT去重右表即可,写法简单高效:
SELECT t1.*, t2.* FROM `your-project.your-dataset.table1` t1 LEFT JOIN ( -- 选择需要关联的字段,确保id2唯一 SELECT DISTINCT id2, column_a, column_b FROM `your-project.your-dataset.table2` ) t2 ON t1.id2 = t2.id2
方法2:用ROW_NUMBER()指定取数逻辑
如果右表同一id2对应的其他字段值不同,你需要明确指定取哪一行(比如最新的、某个字段最大的),可以用窗口函数ROW_NUMBER()实现:
WITH deduplicated_table2 AS ( SELECT id2, column_a, column_b, -- 按id2分组,根据需要的字段排序(比如create_time取最新),给每行打序号 ROW_NUMBER() OVER (PARTITION BY id2 ORDER BY create_time DESC) AS row_num FROM `your-project.your-dataset.table2` ) SELECT t1.*, t2.id2, t2.column_a, t2.column_b FROM `your-project.your-dataset.table1` t1 LEFT JOIN deduplicated_table2 t2 ON t1.id2 = t2.id2 AND t2.row_num = 1 -- 只取每组的第一行
注意事项
- 方法1适合重复数据完全一致的场景,执行效率更高;
- 方法2可以灵活控制取重复数据中的哪一行,比如按时间、数值排序选择优先级最高的记录;
- 替换SQL中的
your-project.your-dataset和字段名,匹配你的实际数据结构即可。
内容的提问来源于stack exchange,提问作者Jim E Russel
相关产品推荐
相关产品推荐

