我有一张看起来像这样的桌子:
身份证 | completion_Rate - 第 1 步 | completion_Rate - 步骤2 | 完成率 - 步骤 3 |
---|---|---|---|
id1 | 0 | 29 | 54 |
id2 | 0 | 22 | 76 |
我想将其转向:
身份证 | 步数 | 完成率 |
---|---|---|
id1 | 1 | 0 |
id1 | 2 | 29 |
id1 | 3 | 54 |
id1 | 1 | 0 |
id2 | 2 | 22 |
id3 | 3 | 76 |
我知道 Vertica 中没有 Pivot 功能,但也许有一种聪明的方法可以做到这一点?
(如果没有的话,我就退一步来说,原来的表格是这样的:
id | 完成率 |
---|---|
id1 | 0_29_54 |
id2 | 0_22_76 |
因此,如果有另一种方法可以将此字符串“分解”为行,而不首先使用拆分部分转换为列,它也会对我有所帮助。 )
我尝试拆分成列,但现在我找不到旋转的方法
据我所知,有两种方法可以实现。
如果您有大量列,那么也许可以使用一些脚本来生成 SQL。
选项1:
WITH input_data (id, completion_rate)
AS (
SELECT 'id1', '0_29_54'
UNION ALL
SELECT 'id2', '0_22_76'
)
SELECT id, completion_rate FROM (
SELECT EXPLODE(id, STRING_TO_ARRAY(split_part(completion_rate, '_', 1)
|| ',' || split_part(completion_rate, '_', 2)
|| ',' || split_part(completion_rate, '_', 3))::Array [int])
OVER (PARTITION BEST) AS (
id
, position
, completion_rate
) FROM input_data
) sub;
id | completion_rate
-----+-----------------
id1 | 0
id1 | 29
id1 | 54
id2 | 0
id2 | 22
id2 | 76
(6 rows)
选项2:
WITH input_data (id, completion_rate)
AS (
SELECT 'id1', '0_29_54'
UNION ALL
SELECT 'id2', '0_22_76'
)
SELECT id
, split_part(completion_rate, '_', 1) as completion_rate
FROM input_data
UNION ALL
SELECT id
, split_part(completion_rate, '_', 2) as completion_rate
FROM input_data
UNION ALL
SELECT id
, split_part(completion_rate, '_', 3) as completion_rate
FROM input_data
;
id | completion_rate
-----+-----------------
id1 | 0
id2 | 0
id1 | 29
id2 | 22
id1 | 54
id2 | 76
(6 rows)