红移数据库数据透视表

问题描述:

我知道这个问题之前已经被问过了,但是任何答案都无法帮助我满足我期望的要求。所以问这个问题在新线程红移数据库数据透视表

在红移如何使用透视数据到每个每一个独特的维度组一行的形式,例如:

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不支持数据透视运算符和一个case表达式将不会有太大的帮助(如果不是请建议如何做)

我怎样才能达到这个红移的结果?

(以上只是一个例子,我们将有超过1000个类别和这些类别保持对不断变化的)

+0

看看这个解决方法。不理想,但确实允许任意数量的类别。 HTTP://计算器。com/questions/42684179/aws-redshift-pivot-table-all-dimensions/42687221#42687221 – systemjack

我不认为这是一个简单的方法来做到这一点的红移,

也你说你有更多的则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或红移

+0

感谢您的回复,并通知我有关redshift的局限性 – ankitkhanduri

如果你通常会想查询从数据透视表中类别的特定子集,基于评论链接的方法解决方法可能会奏效。

可以填充你的“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个字节应该有几千个类别的空间。

+0

感谢帮助systemjack, ,但我认为即使提取一个json我需要手动写入类别名称,然后提取,因为菜单保存和更改以及类别随时间而变化,所以必须手动编辑pivot_table查询以提取更新的类别 以及还有其他餐馆正在添加时,count列wuld增加查询必须被编辑为 – ankitkhanduri

+0

类别的变化,也正如上面指出的答案红移限制一列到1600单个表 因此,我想我正在尝试使用红移wu ld不可行 如果wrng plz建议如何去做 – ankitkhanduri

+0

你不能用这种方法做'select *',所以这是一个限制,可能会使其对某些人不可行。你必须知道并指定类别。它没有1600列问题,因为它只将所有内容存储在3列中。类别数据全部被打包成一个恰好是JSON格式的单个字符串。 – systemjack