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>。有问题的字段类型为 RECORD mode REPEATED 对不起,我不是来自 SQL 背景,所以这对我来说有点像一个黑盒子。 当然,我会的。要对问题进行投票,您应该点击答案左侧的向上箭头 - 请这样做

以上是关于BigQuery:使用 SQL 从辅助表中查找 ID 数组并连接数据的主要内容,如果未能解决你的问题,请参考以下文章

在 CLI 上使用 bq 从 BigQuery 标准 SQL 连接表中打印出漂亮的值表?

如何从 BigQuery 中存储的大型线串数据集中查找所有道路交叉口

在新的 BigQuery 标准 SQL 的数组中使用结构

BigQuery 标准 SQL:从表中删除重复项

如何从具有字典列表的表中查询,仅针对某些键 (BigQuery) SQL

在从日志条目创建的会话表中查找并发用户