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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:42:38