BigQuery:使用 SQL 从辅助表中查找 ID 数组并连接数据
Posted
技术标签:
【中文标题】BigQuery:使用 SQL 从辅助表中查找 ID 数组并连接数据【英文标题】:BigQuery: Lookup array of IDs and join data from secondary table using SQL 【发布时间】:2020-07-09 05:32:23 【问题描述】:我有一个如下的数据结构:
产品
| _id | name | available_in_region_id |
-----------------------------------------
| d22 | shoe | c32, a43, x53 |
| t64 | hat | c32, f42 |
地区
| _id | name |
---------------------
| c32 | london |
| a43 | manchester |
| x53 | bristol |
| f42 | liverpool |
我想查找“available_in_region_id” id 的数组并将它们替换为区域名称,以生成如下表:
| _id | name | available_in_region_name |
----------------------------------------------
| d22 | shoe | london, manchester, bristol |
| t64 | hat | london, liverpool |
使用标准 SQL 执行此操作的最佳方法是什么?
谢谢,
一个
【问题讨论】:
【参考方案1】:以下是 BigQuery 标准 SQL
#standardSQL
SELECT p._id, p.name,
STRING_AGG(r.name, ', ' ORDER BY OFFSET) AS available_in_region_name
FROM `project.dataset.Products` p,
UNNEST(SPLIT(available_in_region_id, ', ')) rid WITH OFFSET
LEFT JOIN `project.dataset.Regions` r
ON rid = r._id
GROUP BY _id, name
您可以使用您问题中的示例数据进行测试,如以下示例所示
#standardSQL
WITH `project.dataset.Products` AS (
SELECT 'd22' _id, 'shoe' name, 'c32, a43, x53' available_in_region_id UNION ALL
SELECT 't64', 'hat', 'c32, f42'
), `project.dataset.Regions` AS (
SELECT 'c32' _id, 'london' name UNION ALL
SELECT 'a43', 'manchester' UNION ALL
SELECT 'x53', 'bristol' UNION ALL
SELECT 'f42', 'liverpool'
)
SELECT p._id, p.name,
STRING_AGG(r.name, ', ' ORDER BY OFFSET) AS available_in_region_name
FROM `project.dataset.Products` p,
UNNEST(SPLIT(available_in_region_id, ', ')) rid WITH OFFSET
LEFT JOIN `project.dataset.Regions` r
ON rid = r._id
GROUP BY _id, name
有输出
Row _id name available_in_region_name
1 d22 shoe london, manchester, bristol
2 t64 hat london, liverpool
【讨论】:
感谢您的回答,但也许这个问题有点误导,但 ID 不是数字,它们是 mongodb 12 位 objectIds,更像是“3d42nd3nd32dd2278dn2”。我假设这将无法使用“消除偏移” 查看更新的答案以匹配您问题中的更改 谢谢。但是,我收到一个错误:参数类型的函数 SPLIT 没有匹配的签名:ARRAY以上是关于BigQuery:使用 SQL 从辅助表中查找 ID 数组并连接数据的主要内容,如果未能解决你的问题,请参考以下文章
在 CLI 上使用 bq 从 BigQuery 标准 SQL 连接表中打印出漂亮的值表?
如何从 BigQuery 中存储的大型线串数据集中查找所有道路交叉口