在加入 BigQuery 期间优先处理一个表
Posted
技术标签:
【中文标题】在加入 BigQuery 期间优先处理一个表【英文标题】:Prioritizing one table during the join BigQuery 【发布时间】:2021-12-20 15:32:31 【问题描述】:我在 BigQuery 中有两个具有相同架构的表。第一个包含产品的历史记录,第二个 - 最近的产品。我的目标是连接两个表,以便每当产品 id 不在第二个表中时,我们使用历史数据中的行,但是当我们有不在历史数据中的产品 id 交集时,我们使用来自第二个表(包含最新数据)。
我的第一个解决方案是使用 UNION ALL 和窗口函数来丢弃交叉路口的重复项,但我想知道是否有另一种方法可以使用某种 FULL OUTER JOIN。
【问题讨论】:
【参考方案1】:对于这种情况,您可以使用FULL OUTER JOIN
。通过使用FULL OUTER JOIN
,它将返回所有字段和列,包括空值。我创建了 2 个与您的场景匹配的表:
tblA
作为历史表:
tblB
作为最近的表:
请注意,两张桌子上都有 product_id
= 0050,但产品不同,tblA
有 product
='Jelly' 和 tblB
有product
='王牌'。根据您的要求,您需要优先考虑来自tblB
(即product
='Ace')的结果,作为包含最近数据的表。当tblB
中没有现有数据/空值时,您可以使用tblA
进行引用。此查询满足要求:
SELECT product_id, COALESCE(b.product, a.product) AS product
FROM `tblA` AS a
FULL OUTER JOIN `tblB` AS b USING (product_id)
ORDER BY product_id;
结果:
COALESCE
返回第一个非空表达式的值,因此通过将b.product
作为参数中的第一个,如果满足,它将返回第一个结果的结果。如果没有,它会检查第二个参数a.product
。
【讨论】:
以上是关于在加入 BigQuery 期间优先处理一个表的主要内容,如果未能解决你的问题,请参考以下文章