在加入 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,但产品不同,tblAproduct='Jelly'tblBproduct='王牌'。根据您的要求,您需要优先考虑来自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 期间优先处理一个表的主要内容,如果未能解决你的问题,请参考以下文章

Big Query 不允许创建表

无法导出 Big Query 表

Big Query 表对象属性为空

在 SQL (Big Query) 中生成序列/范围/数组,其中最小值和最大值取自另一个表

将Big Query中的数据自动导入Google表格?

BigQuery:加入集群字段