我知道之前已经问过这个问题但是任何答案都无法帮助我达到我想要的要求。所以在新线程中提出问题
在redshift中,如何使用每个唯一维度集将数据转换为一行的形式,例如:
id Name Category count
8660 Iced Chocolate Coffees 105
8660 Iced Chocolate Milkshakes 10
8662 Old Monk Beer 29
8663 Burger Snacks 18
至
id Name Cofees Milkshakes Beer Snacks
8660 Iced Chocolate 105 10 0 0
8662 Old Monk 0 0 29 0
8663 Burger 0 0 0 18
上面列出的类别会不断变化。 Redshift不支持pivot运算符,case
表达式没有多大帮助(如果没有请建议怎么做)
如何在红移中实现此结果?
(以上只是一个例子,我们将有1000多个类别,这些类别一直在变化)
我们在Ro - we built python based tool进行了很多轮转,以自动生成数据透视查询。此工具允许使用与excel中相同的基本选项,包括指定聚合函数以及是否需要整体聚合。
我不认为在Redshift中有一种简单的方法可以做到这一点,
另外你说你有超过1000个类别,而且你需要考虑到每个表限制1600列的数量越来越多,
见附件链接[http://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_usage.html][1]
你可以使用案例但是你需要为每个类别创建案例
select id,
name,
sum(case when Category='Coffees' then count) as Cofees,
sum(case when Category='Milkshakes' then count) as Milkshakes,
sum(case when Category='Beer' then count) as Beer,
sum(case when Category='Snacks' then count) as Snacks
from my_table
group by 1,2
你有其他选择是将表上传到例如R,然后你可以使用cast函数。
cast(data, name~ category)
然后将数据上传回S3或Redshift
如果您通常希望从数据透视表中查询类别的特定子集,则基于注释中链接的方法的变通方法可能有效。
您可以从原始文件中填充“pivot_table”,如下所示:
insert into pivot_table (id, Name, json_cats) (
select id, Name,
'{' || listagg(quote_ident(Category) || ':' || count, ',')
within group (order by Category) || '}' as json_cats
from to_pivot
group by id, Name
)
并以这种方式访问特定类别:
select id, Name,
nvl(json_extract_path_text(json_cats, 'Snacks')::int, 0) Snacks,
nvl(json_extract_path_text(json_cats, 'Beer')::int, 0) Beer
from pivot_table
使用varchar(max)
作为JSON列类型将给出65535个字节,这应该是几千个类别的空间。