【问题标题】:Pivot for redshift database红移数据库的枢轴
【发布时间】:2017-07-30 08:48:11
【问题描述】:

我知道以前有人问过这个问题,但任何答案都无法帮助我满足我想要的要求。所以在新线程中提出问题

在 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 不支持枢轴运算符,case 表达式不会有太大帮助(如果不支持,请建议如何操作)

我怎样才能在红移中实现这个结果?

(以上只是一个示例,我们将有 1000 多个类别,并且这些类别不断变化)

【问题讨论】:

标签: sql pivot amazon-redshift


【解决方案1】:

我认为在 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 end) as Cofees,       
       sum(case when Category='Milkshakes' then count end) as Milkshakes,
       sum(case when Category='Beer' then count end) as Beer,
       sum(case when Category='Snacks' then count end) as Snacks
from my_table
group by 1,2

您可以选择将表格上传到 R,然后您可以使用 cast 函数。

cast(data, name~ category)

然后将数据上传回 S3 或 Redshift

【讨论】:

  • 感谢您的回复并告知我红移的限制
  • Amazon](500310) 无效操作:“)”处或附近的语法错误
【解决方案2】:

如果您通常希望从数据透视表中查询特定类别的子集,则基于 cmets 中链接的方法的解决方法可能会奏效。

您可以像这样从原始数据中填充“数据透视表”:

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

对 JSON 列类型使用 varchar(max) 将提供 65535 个字节,这应该可以容纳几千个类别。

【讨论】:

  • 感谢 systemjack 的帮助,但我认为即使提取 json 我也需要手动编写类别名称然后提取,因为菜单保持和更改以及类别必然会随着时间而改变所以有手动编辑 pivot_table 查询以提取更新的类别,并且当添加更多餐厅时,必须编辑列数增加查询以更改类别
  • 并且正如在上面的答案中指出的那样,redshift 将单个表的列限制为 1600 所以我认为我试图使用 redshift 实现的内容是不可行的,如果 wrng plz 建议怎么做它
  • 你不能用这种方法做select *,所以这是一个限制,可能使它对某些人不可行。您必须知道并指定类别。它没有 1600 列的问题,因为它只将所有内容存储在 3 列中。类别数据都被打包成一个字符串,恰好是 JSON 格式。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    @user3600910 使用该方法是正确的,但是需要“END”,否则会发生“500310”无效操作。

    select id,
           name,
           sum(case when Category='Coffees' then count END) as Cofees,       
           sum(case when Category='Milkshakes' then count END) as Milkshakes,
           sum(case when Category='Beer' then count END) as Beer,
           sum(case when Category='Snacks' then count END) as Snacks
    from my_table
    group by 1,2
    

    【讨论】:

      【解决方案5】:

      count 切换为1 后,上面给出的答案对我有用

      select id,
             name,
             sum(case when Category='Coffees' then 1 end) as Cofees,       
             sum(case when Category='Milkshakes' then 1 end) as Milkshakes,
             sum(case when Category='Beer' then 1 end) as Beer,
             sum(case when Category='Snacks' then 1 end) as Snacks
      from my_table
      group by 1,2
      

      【讨论】:

        猜你喜欢
        • 2022-08-04
        • 1970-01-01
        • 2017-06-10
        • 1970-01-01
        • 2016-12-14
        • 1970-01-01
        • 1970-01-01
        • 2016-11-05
        • 1970-01-01
        相关资源
        最近更新 更多