如何将数据列转换为单列,其中每一行数据垂直堆叠在该列中(在 Postgres 中)?

Posted

技术标签:

【中文标题】如何将数据列转换为单列,其中每一行数据垂直堆叠在该列中(在 Postgres 中)?【英文标题】:How to transform columns of data to a single column, where each row of data is stacked vertically in that column (in Postgres)? 【发布时间】:2020-11-10 13:07:52 【问题描述】:

我们有一个这样的水平数据表示:

|id|col1|col2|col3|col4|col5|
|01|1111|2222|3333|4444|5555|
|02|1234|5678|9012|3456|7890|
...

我想把它改成这样:

|id|col|col_data|
|01|  1|    1111|
|01|  2|    2222|
|01|  3|    3333|
|01|  4|    4444|
|01|  5|    5555|
|02|  1|    1234|
|02|  2|    5678|
|02|  3|    9012|
|02|  4|    3456|
|02|  5|    7890|
....

我能够正确列出目标表的|id|col| 列:

SELECT 
    id,
    unnest((
        select
            array_agg(split_part(column_name::text, 'l', 2)::numeric)
        FROM INFORMATION_SCHEMA.columns
        WHERE 
            TABLE_NAME = 'my_table' and 
            TABLE_SCHEMA = 'my_schema'
    )) AS "col"
FROM my_schema.my_table
group by "col" id
ORDER BY id, "col";

但我不知道如何从源表中获取所需格式的数据。

仅供参考:

我没有超级用户权限。 实际表格有 26 列

【问题讨论】:

【参考方案1】:

如果所有列都具有相同的数据类型,一种方法是横向连接:

select t.id, up.*
from the_table t
  cross join lateral (
    values (1, col1), (2, col2), (3, col3), (4, col4), (5, col5)
  ) as up(col, col_data);

如果您不在乎将所有内容都转换为文本(不保留原始数据类型),则可以使用 JSON 对列进行反透视:

select t.id, 
       up.col, 
       up.col_data
from the_table t
  cross join jsonb_each_text(to_jsonb(t) - 'id') as up(col, col_data)

【讨论】:

以上是关于如何将数据列转换为单列,其中每一行数据垂直堆叠在该列中(在 Postgres 中)?的主要内容,如果未能解决你的问题,请参考以下文章

将多个火花数据框列转换为具有列表类型的单列

如何将 Spark Dataframe 列转换为字符串数组的单列

Flexbox:单列到堆叠的多列

Bootstrap 列垂直堆叠而不是水平堆叠

熊猫数据框:将列转换为单列的行

在单列上应用 Pig UDF 并自动生成所有其他列