是否可以在BigQuery中UNNEST一个数组,以便将嵌套数据通过键值拆分为列?

时间:2019-05-20 15:02:55

标签: google-bigquery

比方说,我在BigQuery中有一些数据,其中包括嵌套的对象数组,如下所示:

{
    "name" : "Bob",
    "age": "24",
    "customFields": [
      {
        "index": "1",
        "value": "1.98"
      },
      {
        "index": "2",
        "value": "Nintendo"
      },
      {
        "index": "3",
        "value": "Yellow"
      }
    ]
}

我只能取消嵌套此数据,以便“索引”和“值”字段为列:

+------+-----+-------+----------+
| name | age | index |  value   |
+------+-----+-------+----------+
| Bob  |  24 |     1 | 1.98     |
| Bob  |  24 |     2 | Nintendo |
| Bob  |  24 |     3 | Yellow   |
+------+-----+-------+----------+

在大多数情况下,这将是理想的输出,但是由于我使用的数据是指Google Analytics(分析)自定义维度,因此我需要做些更复杂的事情。我正在尝试获取要在数据出现的列名称中使用的索引值,如下所示:

+------+-----+---------+----------+---------+
| name | age | index_1 | index_2  | index_3 |
+------+-----+---------+----------+---------+
| Bob  |  24 |    1.98 | Nintendo | Yellow  |
+------+-----+---------+----------+---------+

这可能吗?生成此输出所需的SQL查询是什么?应该在列名中使用“ index”值,因为输出不会一直出现在有序的“ 1,2,3,...”中。

1 个答案:

答案 0 :(得分:1)

您所描述的内容通常称为数据透视表-一种将值用作列的转换。 SQL通常不支持此功能,因为SQL是围绕具有固定模式的概念设计的,而数据透视表需要动态模式。

但是,如果您有一组固定的索引列,则可以使用类似以下内容的方法进行模拟:

SELECT
  name,
  age,
  ARRAY(SELECT value FROM UNNEST(customFields) WHERE index="1")[SAFE_OFFSET(0)] AS index_1,
  ARRAY(SELECT value FROM UNNEST(customFields) WHERE index="2")[SAFE_OFFSET(0)] AS index_2,
  ARRAY(SELECT value FROM UNNEST(customFields) WHERE index="3")[SAFE_OFFSET(0)] AS index_3
FROM your_table;

这是专门为每个索引定义列,这些索引从customFields数组中选取正确的值。