Is it possible to UNNEST an array in BigQuery so that the nested data in split into columns by a key value?
假设我在 BigQuery 中有一些数据,其中包括一个嵌套的对象数组,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | { "name" :"Bob", "age":"24", "customFields": [ { "index":"1", "value":"1.98" }, { "index":"2", "value":"Nintendo" }, { "index":"3", "value":"Yellow" } ] } |
我只能取消嵌套这些数据,以便 "index" 和 "value" 字段是列:
1 2 3 4 5 6 7 | +------+-----+-------+----------+ | name | age | index | value | +------+-----+-------+----------+ | Bob | 24 | 1 | 1.98 | | Bob | 24 | 2 | Nintendo | | Bob | 24 | 3 | Yellow | +------+-----+-------+----------+ |
在大多数情况下,这将是所需的输出,但由于我使用的数据是指 Google Analytics(分析)自定义维度,因此我需要一些更复杂的东西。我正在尝试获取要在数据出现的列的名称中使用的索引值,如下所示:
1 2 3 4 5 | +------+-----+---------+----------+---------+ | name | age | index_1 | index_2 | index_3 | +------+-----+---------+----------+---------+ | Bob | 24 | 1.98 | Nintendo | Yellow | +------+-----+---------+----------+---------+ |
这可能吗?生成此输出所需的 SQL 查询是什么?它应该在列名中使用 "index" 值,因为输出不会一直在有序的 "1,2,3,..." 中。
您所描述的通常被称为数据透视表 - 一种将值用作列的转换。 SQL 通常不支持这一点,因为 SQL 是围绕具有固定架构的概念设计的,而数据透视表需要动态架构。
但是,如果你有一组固定的索引列,你可以用类似的东西来模拟它:
1 2 3 4 5 6 7 | 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 数组中挑选出正确值的每个索引定义列。