动态SQL语句创建 - Scala

时间:2016-11-01 03:36:51

标签: sql scala pivot

我有一个包含以下值的文件

matchId                                 Id
2e0c6c42-68ac-43e0-b130-1b986f61a462    segA
2e0c6c42-68ac-43e0-b130-1b986f61a463    segB
2e0c6c42-68ac-43e0-b130-1b986f61a463    segC
2e0c6c42-68ac-43e0-b130-1b986f61a463    segA

我想要如下所示的轮播结果

matchid                                    segA segB segC
2e0c6c42-68ac-43e0-b130-1b986f61a463       1    1    1
2e0c6c42-68ac-43e0-b130-1b986f61a462       1    0    0

这意味着SegA中存在一些id,所有段中都存在一些id(应该表示为二进制1和0)

由于段的数量可以变化,我希望使用Scala动态生成SQL语句,如下所示(它应按照段的数量向上或向下扩展,例如今天我有10段,明天它可以是5,依此类推。) 从SQL(AWS Redshift DB)的角度来看,如果我已经知道了段的数量,我可以生成以下查询,但随着段数的增加,这会变得复杂。

CREATE TABLE pivotedsegments distkey(match_id) AS (
SELECT match_id,
MAX(CASE WHEN segment='Seg1' then 1 else 0 end) Seg1,
MAX(CASE WHEN segment='Seg2' then 1 else 0 end) Seg2,
MAX(CASE WHEN segment='Seg3' then 1 else 0 end) Seg3,
MAX(CASE WHEN segment='Seg4' then 1 else 0 end) Seg4,
MAX(CASE WHEN segment='Seg5' then 1 else 0 end) Seg5,
MAX(CASE WHEN segment='Seg6' then 1 else 0 end) Seg6,
MAX(CASE WHEN segment='Seg7' then 1 else 0 end) Seg7,
MAX(CASE WHEN segment='Seg8' then 1 else 0 end) Seg8,
MAX(CASE WHEN segment='Seg9' then 1 else 0 end) Seg9,
MAX(CASE WHEN segment='Seg10' then 1 else 0 end) Seg10,
MAX(CASE WHEN segment='Seg11' then 1 else 0 end) Seg11,
.
.
.
.
From some-table group by matchid;

所以我想设计一个scala API,它可以读取这样的文件并以旋转方式转换结果。

请建议。

0 个答案:

没有答案