如何将数据列转换为单列,其中每一行数据垂直堆叠在该列中(在 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 中)?的主要内容,如果未能解决你的问题,请参考以下文章