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
但是,我有大量的组需要转置,即m1
、m2
、...
如何遍历所有不同的值并对它们中的每一个应用相同的逻辑并对生成的列名起别名?
【问题讨论】:
据我所知,你不能。您可能只需要通过一些脚本为每个唯一的 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 数据透视表所有维度的主要内容,如果未能解决你的问题,请参考以下文章
使用 Redshift (PostgreSQL) 和计数的数据透视表