【发布时间】:2020-04-30 11:30:06
【问题描述】:
我在尝试将一个表中的数据与 Google BigQuery 中另一个表中的数据进行映射时遇到问题。为了简单起见:
我有dataTable 和data_modelname, data_version, data_date 列。
mappingTable 包含 mapping_modelname, mapping_version, mapping_date。
当我尝试这段代码时,
UPDATE dataTable
SET
dataTable.data_date = mappingTable.data_date,
dataTable.data_version = mappingTable.data_version
FROM mappingTable
WHERE
LOWER(data_modelname) IN (
SELECT DISTINCT LOWER(mapping_modelname) AS distinctModel
FROM mappingTable
WHERE mappingTable.data_version IS NOT NULL
)
我从 BigQuery 收到以下错误消息:
UPDATE/MERGE 必须与每个目标行最多匹配一个源行
select distinct 语句返回约 300 个不同模型的列表。因此,在考虑 WHERE 条件时,只有一个结果,例如 LOWER(data_modelname) 为 LOWER(ABC123)。
不幸的是,我的mappingTable 每个模型包含多个条目(重复),但我只想要找到的第一个条目。 Updating with LIMIT 1 没用。
我也尝试了这段代码,它的映射表条目较少,因此没有重复项。这运作良好。但是,当有多个型号名称时,它会返回相同的错误。
WHERE LOWER(data_modelname) = LOWER(mapping_modelname)
请您帮我将mappingTable.data_date 和mappingTable.data_version 中的mapping table 插入(更新)到data table where the data_modelname is mapping_modelname.
此外,能够使用一些通配符或正则表达式来映射模型名称会很棒,例如WHERE LOWER(data_modelname) IS LIKE '% mapping_modelname %'。
非常感谢。
编辑,新问题:
我现在遇到了另一个问题。相同的情况和表格,但我现在需要做的是更新字段data_date_Installed,其中模型和data_version_Installed 相同。所以在我的data-table 中有一个版本字段“3.4”和data_model "ABC123"。在mapping-table 中还有mapping_model "ABC123" 和mapping_version_Installed 中的许多不同版本,当然还有“3.4”和字段mapping_date_installed 中该版本的相应日期。
我试过这段代码,但它只匹配 1m 中的 88 个值。
UPDATE dataTable dt
SET dt.data_date_installed = mapping_date_installed,
FROM (SELECT ARRAY_AGG(mt LIMIT 1)[ORDINAL(1)].*
FROM mappingTable mt
WHERE mt.data_installed_version IS NOT NULL
GROUP BY LOWER(mt.mapping_modelname)
) mt
WHERE LOWER(mt.mapping_modelname) = LOWER(dt.data_modelname)
AND
data_version_Installed = mapping_version_Installed
实际上我可以排除表中的错误:两个表中的映射值正确且数据类型也正确(日期 = DATE 和版本 = STRING)。此外,将字符串与LIKE instead of = 进行比较也不会产生更多匹配值。
也许GROUP BY statement 省略了许多可能的安装版本。
如果您有什么建议,我非常高兴和感激。
编辑,已解决:
可以用简单的 SQL WHERE 来解决这个问题:
WHERE LOWER(mt.mapping_model) = LOWER(FINAL_modelName)
AND
data_date_installed = mt.mapping_date_installed
【问题讨论】:
标签: sql google-bigquery sql-update