5

我在 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        

生成执行这种展开的查询的好模式是什么?

Amazon RedShift 基于 ParAccel 并支持 PostgreSQL 8.0.2 ,它没有crosstab、或.unnestpivotunpivot

4

1 回答 1

11

您可以为每个 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 的默认设置相反。

于 2013-12-18T16:14:20.540 回答