AWS Redshift 数据透视表所有维度

Posted

技术标签:

【中文标题】AWS Redshift 数据透视表所有维度【英文标题】:AWS Redshift Pivot Table all Dimensions 【发布时间】:2017-03-08 23:51:47 【问题描述】:

我正在按照方法在 redshift 中旋转一个大表:

Pivot a table with Amazon RedShift / PostgreSQL

但是,我有大量的组需要转置,即m1m2、... 如何遍历所有不同的值并对它们中的每一个应用相同的逻辑并对生成的列名起别名?

【问题讨论】:

据我所知,你不能。您可能只需要通过一些脚本为每个唯一的 metricName 生成 case 语句,或者老实说,excel 公式可以很好地用于一次性查询。 【参考方案1】:

如果您希望能够转向任意数量的组,您可以将这些组组合成一个 JSON 字符串,然后使用 Redshift JSON functions 提取您感兴趣的组。对于非常大的数据集,您可能不希望这样做。

这里是基于question linked above中的样本数据的基本思路:

select DimensionA, DimensionB,
    json_extract_path_text(json_pivot, 'm1') m1,
    json_extract_path_text(json_pivot, 'm2') m2
from (
    select DimensionA, DimensionB,
        '' || listagg(quote_ident(MetricName) || ':' || quote_ident(MetricValue), ',')
               within group (order by MetricName) || '' as json_pivot
    from to_pivot
    group by DimensionA, DimensionB
)

实际上,您不希望这样运行它。内部选择用于生成“透视”表,外部选择显示如何引用特定组值。

这不考虑相同暗淡组合的重复组记录,如下所示:

DimensionA  DimensionB  MetricName  MetricValue
----------  ----------  ----------  -----------
dimA1       dimB2       m1          v13
dimA1       dimB2       m1          v23

如果数据中存在这种可能性,那么您将必须弄清楚如何处理它。我不确定它在实施时会如何表现。我的猜测是第一个匹配项会被提取。

这可以使用LISTAGG 和REGEXP_SUBSTR 的组合以及使用两个自定义分隔符来完成。

varchar(max) 用于JSON column type 将提供65535 个字节,这应该可以容纳几千个类别。

解释slightly differently here。

【讨论】:

以上是关于AWS Redshift 数据透视表所有维度的主要内容,如果未能解决你的问题,请参考以下文章

Excle数据透透视表如何删除数据透视表

按大维度过滤数据透视表

使用 Redshift (PostgreSQL) 和计数的数据透视表

Excle数据透视如何在数据透视表字段列表中显示更多的字段

AWS Redshift SQL - PIVOT 查询(一行/行多次计数)

Redshift 数据库中维度表的排序和分布键选择