【问题标题】:BigQuery: Lookup array of ids type RECORD and join data from secondary table using SQLBigQuery:查找 ID 类型为 RECORD 的数组并使用 SQL 连接辅助表中的数据
【发布时间】:2020-07-09 06:13:29
【问题描述】:

我有一个如下的数据结构:

产品

| name  | region_ids             |
----------------------------------
| shoe  | c32, a43, x53          |
| hat   | c32, f42               |

# Schema
name                STRING  NULLABLE
region_ids          RECORD  REPEATED    
region_ids.value    STRING  NULLABLE    

地区

| _id |  name       |
---------------------
| c32 |  london     |
| a43 |  manchester |
| x53 |  bristol    |
| f42 |  liverpool  |

# Schema
_id                 STRING  NULLABLE
name                STRING  NULLABLE

我想查找“region_ids”的数组并将它们替换为区域名称以生成如下表:

| _id |  name  | region_names                |
----------------------------------------------
| d22 |  shoe  | london, manchester, bristol |
| t64 |  hat   | london, liverpool           |

使用标准 SQL 执行此操作的最佳方法是什么?

谢谢,

一个

【问题讨论】:

  • 取决于精确的 MySQL 版本。
  • 大查询是标准 SQL
  • 例如 - 标准 SQL 允许递归 CTE,似乎...而不是 BigQuery。或者您无论如何都不会使用 MySQL 特定的构造(或者 BQ 不支持原始 SQL)?

标签: mysql join google-bigquery record


【解决方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
SELECT p._id, p.name, 
  STRING_AGG(r.name, ', ' ORDER BY OFFSET) AS region_names 
FROM `project.dataset.Products` p,
UNNEST(region_ids) WITH OFFSET
LEFT JOIN `project.dataset.Regions` r
ON value = r._id
GROUP BY _id, name   

您可以使用您问题中的示例数据进行测试,如以下示例所示

#standardSQL
WITH `project.dataset.Products` AS (
  SELECT 'd22' _id, 'shoe' name, [STRUCT<value STRING>('c32'), STRUCT('a43'), STRUCT('x53')] region_ids UNION ALL
  SELECT 't64', 'hat', [STRUCT<value STRING>('c32'), STRUCT('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 region_names 
FROM `project.dataset.Products` p,
UNNEST(region_ids) WITH OFFSET
LEFT JOIN `project.dataset.Regions` r
ON value = r._id
GROUP BY _id, name   

结果是

Row _id name    region_names     
1   d22 shoe    london, manchester, bristol  
2   t64 hat     london, liverpool      

根据您问题中的输出示例 - 您希望 region_names 为带有逗号分隔名称列表的字符串
但是,如果您需要 region_names 作为数组 - 您可以将 STRING_AGG(r.name, ', ' ORDER BY OFFSET) 替换为 ARRAY_AGG(r.name ORDER BY OFFSET)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 2021-01-03
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多