Vertica 中的数据透视 - 从列到行

问题描述 投票:0回答:1

我有一张看起来像这样的桌子:

身份证 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 database vertica
1个回答
0
投票

据我所知,有两种方法可以实现。

如果您有大量列,那么也许可以使用一些脚本来生成 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)

© www.soinside.com 2019 - 2024. All rights reserved.