将名称/值字段的大型查询重复列列表拆分为单独的列



使用大查询sql,使重复字段的条目成为列的最佳方法是什么?该表有一个重复字段user_attributes,它是一个由30条ish记录组成的列表,每条记录都有两个字段: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个这样的交叉连接会在哪里不需要过滤器,或者变成一个昂贵的查询吗?

或者,这不是最佳做法吗?我想对不同的用户属性字段(统计、平均等(进行分组,所以这就是为什么我想让表更结构化。

您不应该使用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

最新更新