返回根据嵌套对象过滤的 BigQuery 数据

Posted

技术标签:

【中文标题】返回根据嵌套对象过滤的 BigQuery 数据【英文标题】:Returning BigQuery data filtered on nested objects 【发布时间】:2014-12-18 19:44:04 【问题描述】:

我正在尝试创建一个查询,该查询返回在 2 个嵌套对象上过滤的数据。我在代码中添加了 (1) 和 (2) 以表明我想要来自两个不同嵌套对象的结果(我知道这不是一个有效的查询)。我一直在查看 WITHIN RECORD,但我无法理解它。

SELECT externalIds.value(1) AS appName, externalIds.value(2) AS driverRef, SUM(quantity)/ 60 FROM [billing.tempBilling]
WHERE callTo = 'example' AND externalIds.type(1) = 'driverRef' AND externalIds.type(2) = 'applicationName'
GROUP BY appName, driverRef ORDER BY appName, driverRef;

加载到 BigQuery 中的数据如下所示:


  "callTo": "example",
  "quantity": 120,
  "externalIds": [
    "type": "applicationName", "value": "Example App",
    "type": "driverRef", "value": 234
  ]

我想要的结果是这样的:

+-------------+-----------+----------+
|   appName   | driverRef | quantity |
+-------------+-----------+----------+
| Example App |    123    |   12.3   |
| Example App |    234    |  132.7   |
| Test App    |    142    |   14.1   |
| Test App    |    234    |   17.4   |
| Test App    |    347    |  327.5   |
+-------------+-----------+----------+

【问题讨论】:

【参考方案1】:

如果您需要求和的所有数量都在同一条记录中,那么您可以使用 WITHIN RECORD 进行此查询。使用 NTH() WITHIN RECORD 获取记录中字段的第一个和第二个值。然后使用 HAVING 执行过滤,因为它需要一个聚合函数计算的值。

SELECT callTo,
       NTH(1, externalIds.type) WITHIN RECORD AS firstType,
       NTH(1, externalIds.value) WITHIN RECORD AS maybeAppName,
       NTH(2, externalIds.type) WITHIN RECORD AS secondType,
       NTH(2, externalIds.value) WITHIN RECORD AS maybeDriverRef,
       SUM(quantity) WITHIN RECORD
FROM [billing.tempBilling]
HAVING callTo LIKE 'example%' AND
       firstType = 'applicationName' AND
       secondType = 'driverRef';

如果要求和的数量分布在多条记录中,那么您可以从这种方法开始,然后按您的键分组并在外部查询中对这些数量求和。

【讨论】:

以上是关于返回根据嵌套对象过滤的 BigQuery 数据的主要内容,如果未能解决你的问题,请参考以下文章

取消嵌套命中和取消嵌套会话范围的自定义维度 BigQuery 代码过滤器

子句嵌套的 BigQuery 不符合预期

使用 Azure Synapse pyspark 过滤器根据嵌套对象的数据类型展平嵌套的 json 对象

为啥 BigQuery BI 引擎不使用所有预留?

如何从未嵌套的数据(BigQuery 中的 Google Analytics 数据)返回正确的汇总总数

如何根据某些过滤条件从 bigquery 导出数据