我正在按照方法在redshift中旋转一个大表:
Pivot a table with Amazon RedShift / PostgreSQL
但是我有很多小组要转动,m1
,m2
,...
如何遍历所有不同的值并对每个值应用相同的逻辑并将结果列名称别名?
答案 0 :(得分:2)
如果您希望能够转移到任意数量的组,可以将这些组合并为一个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的组合以及两个自定义分隔符来完成。
对JSON column type使用varchar(max)
将提供65535个字节,这应该是几千个类别的空间。