【问题标题】:BigQuery: Lookup array of IDs and join data from secondary table using SQLBigQuery:使用 SQL 从辅助表中查找 ID 数组并连接数据
【发布时间】: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 执行此操作的最佳方法是什么?

谢谢,

一个

【问题讨论】:

    标签: mysql arrays join google-bigquery


    【解决方案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 背景,所以这对我来说有点像一个黑盒子。
    • 当然,我会的。要对问题进行投票,您应该点击答案左侧的向上箭头 - 请这样做
    猜你喜欢
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 2023-03-24
    • 2017-12-10
    • 1970-01-01
    相关资源
    最近更新 更多