首页 > 解决方案 > 将名称/值字段的大查询重复列列表拆分为单独的列

问题描述

使用大查询 sql - 制作重复字段列的条目的最佳方法是什么?该表有一个重复字段 user_attributes ,它是 30 条记录的列表,每条记录都有两个字段:namevalue. 几乎总是有相同的 30 个名称 - 例如假设名称包括fieldAfieldB

在不更改行数的情况下,我想添加 30 列具有这些名称的列,并且数据是值。我有这个

   tbl2 AS (SELECT * EXCEPT(user_attributes, name, value), user_attribute.value AS fieldA
   FROM (tbl1 CROSS JOIN UNNEST(tbl1.user_attributes) AS user_attribute) 
   WHERE user_attribute.name = 'fieldA'),

它解压了其中一个条目 - 但在丢失的地方删除了几行(我宁愿在这些行中有一个 null )。我可以继续这样做,但是 30 个这样的交叉连接会在过滤器正常的情况下不嵌套,还是会变成昂贵的查询?

或者,这不是最佳做法吗?我想对不同的用户属性字段进行分组 - 统计信息、平均值等 - 这就是我想让表格更有条理的原因。

标签: sqlgoogle-bigquery

解决方案


您不应该使用 CROSS JOIN UNNEST,而是可以在 select 语句中解压缩值。通过这种方式,将不会消除具有 NULL 值的行。

例子:

SELECT * EXCEPT(user_attributes),
    (SELECT value FROM UNNEST(user_attributes) WHERE name = 'fieldA') as fieldA,
    (SELECT value FROM UNNEST(user_attributes) WHERE name = 'fieldB') as fieldB,
    (SELECT value FROM UNNEST(user_attributes) WHERE name = 'fieldC') as fieldC
FROM tbl1

推荐阅读