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

BigQuery关联表获取Pet表去重PetID对应数据的实现及Inner Join适用性咨询

解决方案

Inner Join可行性说明

直接使用未做预处理的INNER JOIN不可行:Owner表中单个PetID对应多条所有者记录,直接关联Pet表后会返回多条同PetID的结果,不符合每个PetID仅保留一条记录的要求。但经过对Owner表的去重处理后,可以搭配INNER JOIN实现需求,且INNER JOIN本身的特性可以自动过滤掉Pet表不存在的PetID(如Owner表中的890、901),符合你的过滤要求。

BigQuery实现代码

方案1:使用QUALIFY窗口函数过滤(最简洁)

BigQuery支持标准SQL的QUALIFY语法,可以直接对JOIN后的结果按PetID分组去重:

SELECT
  p.PetID,
  o.OwnerName,
  o.OwnerNumber,
  p.PetName
FROM `你的项目名.你的数据集名.Pet` p
INNER JOIN `你的项目名.你的数据集名.Owner` o
  ON p.PetID = o.PetID
-- 按PetID分组,每组仅保留1条记录,可调整ORDER BY规则指定保留哪条
QUALIFY ROW_NUMBER() OVER (PARTITION BY o.PetID ORDER BY o.OwnerName) = 1

如果不需要指定保留规则,直接省略ORDER BY o.OwnerName即可,和你示例返回的结果完全一致。

方案2:先预处理Owner表再关联

先对Owner表按PetID分组,每组取第一条所有者记录,再和Pet表关联:

SELECT
  p.PetID,
  o.owner_info.OwnerName,
  o.owner_info.OwnerNumber,
  p.PetName
FROM `你的项目名.你的数据集名.Pet` p
INNER JOIN (
  SELECT
    PetID,
    -- 每组取第一条所有者信息
    ARRAY_AGG(STRUCT(OwnerName, OwnerNumber) LIMIT 1)[OFFSET(0)] AS owner_info
  FROM `你的项目名.你的数据集名.Owner`
  GROUP BY PetID
) o
  ON p.PetID = o.PetID

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 02:57:03