我在Amazon RedShift中有几个表,这些表遵循几个维度列和一对指标名称/值列的模式。
DimensionA DimensionB MetricName MetricValue ---------- ---------- ---------- ----------- dimA1 dimB1 m1 v11 dimA1 dimB2 m1 v12 dimA1 dimB2 m2 v21 dimA2 dimB2 m1 v13 dimA3 dimB1 m2 v22
我正在寻找一种很好的方法来将数据展开/旋转为每个唯一维度集一行的形式,例如:
DimensionA DimensionB m1 m2 ---------- ---------- --- --- dimA1 dimB1 v11 dimA1 dimB2 v12 v21 dimA2 dimB2 v13 dimA3 dimB1 v22
生成将执行此展开的查询的良好模式是什么?
亚马逊红移是基于ParAccel和支持PostgreSQL的8.0.2,它不具有crosstab,unnest,pivot或unpivot。
crosstab
unnest
pivot
unpivot
您可以只为每个MetricName创建一个CASE语句,但是还必须使用聚合来使GROUP BY工作。
SELECT dimension_a ,dimension_b ,MAX(CASE WHEN metric_name = 'm1' THEN metric_value ELSE NULL END) m1 ,MAX(CASE WHEN metric_name = 'm2' THEN metric_value ELSE NULL END) m2 FROM my_table GROUP BY dimension_a ,dimension_b ;
值得注意的是,Redshift对象名称从不区分大小写,但列内容始终是区分大小写的,这与SQL Server默认设置相反。