为红移数据库提供支持

问题描述 投票:10回答:3

我知道之前已经问过这个问题但是任何答案都无法帮助我达到我想要的要求。所以在新线程中提出问题

在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多个类别,这些类别一直在变化)

sql pivot amazon-redshift
3个回答
6
投票

我们在Ro - we built python based tool进行了很多轮转,以自动生成数据透视查询。此工具允许使用与excel中相同的基本选项,包括指定聚合函数以及是否需要整体聚合。


5
投票

我不认为在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


2
投票

如果您通常希望从数据透视表中查询类别的特定子集,则基于注释中链接的方法的变通方法可能有效。

您可以从原始文件中填充“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个字节,这应该是几千个类别的空间。

© www.soinside.com 2019 - 2024. All rights reserved.