在Vertica中旋转

时间:2017-04-19 15:00:07

标签: sql tsql vertica

我有一张如下表:

Geography        Period        Campaign        VariableName        VariableValue
11111            4/1/2017      ABC             TV_Imp              0.4
11111            4/2/2017      ABC             TV_Imp              0.5
11112            4/1/2017      ABC             TV_Imp              0.1
11113            4/2/2017      ABC             TV_Clicks           0.7
11113            4/2/2017      CDE             TV_Clicks           0.7
11113            4/3/2017      FGH             TV_Imp              0.5

我希望将该表转换/转换为:

Geography    Period    ABC_TV_Imp    ABC_TV_Clicks    CDE_TV_Clicks    FGH_TV_Imp
11111        4/1/2017  0.4           0                0                0
11111        4/2/2017  0.5           0                0                0
11112        4/1/2017  0.1           0                0                0
11113        4/2/2017  0             0.7              0                0
11113        4/2/2017  0             0                0.7              0
11113        4/3/2017  0             0                0                0.5

这里的问题是我提前不知道CampaignVariableName列下的值是什么。它们的范围可以从每个约100-400个不同的值。由于Vertica也没有PIVOT API,也没有可能在那里编写动态SQL,我想知道在Vertica中创建数据透视表的最佳方法是什么。

另外,因为原始/源表有大约180米的行,所以进行旋转的最有效(计算)方式。我考虑过将原始表格拆分三个或更多(按GeographyPeriodCampaignVaribleName进行分组,然后按Campaign和{{1进行拆分在将它们重新合并之前,在每个组中启动单个透视过程。实际上,我希望能够“平行化”。旋转过程加快时间。那会有帮助吗?

先谢谢您的建议/建议!

2 个答案:

答案 0 :(得分:1)

此答案解释了如何生成所需的SQL。生成SQL后,您需要运行它。

首先:

select distinct campaign, variable_name
from t;

这将生成您的所有代码。将其放在电子表格中并使用公式创建该行:

(case when campaign = $campaign and variable_name = $variable_name then variable_value else 0 end) as $campaign_$variable_name,

您也可以在SQL中执行此操作:

select distinct 
       replace(replace('(case when campaign = ''$campaign'' and variable_name = ''$variable_name'' then variable_value else 0 end) as $campaign_$variable_name,',
                        '$campaign', campaign
                      ), $variable_name, variable_name
              )
from t;

这是您需要编写的大部分SQL。执行以下操作:

  • select geography, period,放在第一行
  • 之前
  • 删除最后一个逗号
  • 添加from t group by geography, period
  • 运行SQL语句

答案 1 :(得分:1)

创建表数据透视表 ( master_country varchar(25) ); select max(decode(rn, 1, master_country, null)) || ', ' ||max(decode(rn, 2, master_country, null)) || ', ' ||max(decode(rn, 3, master_country, null)) || ', ' ||max(decode(rn, 4, master_country, null)) || ', ' ||max(decode(rn, 5, master_country, null)) master_country from (select master_country, row_number() over () rn from pivotst) foo; 插入最重要的值(“海得拉巴”); 插入最重要的值('chennai');

从pivost中选择*;

选择max(decode(rn,1,master_country,null))|| ','|| max(decode(rn,2,master_country,null))|| ','|| max(decode(rn,3,master_country,null))|| ','|| max(decode(rn,4,master_country,null))|| ','|| max(decode(rn,5,master_country,null))master_country来自(选择master_country,row_number()超过()rnestpstst)foo;