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
相关产品推荐
相关产品推荐

