如何使用PostgreSQL将宽格式数据重塑为长格式?
PostgreSQL 宽表转长格式解决方案
假设你的源表名为original_table,可以通过**横向展开(Unpivot)**结合字符串拆分实现需求,以下是两种可行的SQL写法:
方法一:使用LATERAL VALUES(推荐,可读性强)
SELECT split_part(col_name, '_', 1) AS upper_case, split_part(col_name, '_', 2) AS lower_case, col_value AS value FROM original_table, LATERAL ( VALUES ('A_a', A_a), ('B_a', B_a), ('A_b', A_b), ('B_b', B_b) ) AS unpivoted(col_name, col_value);
原理说明:
LATERAL VALUES将源表的每一行数据,转换为包含4行的键值对集合(列名+对应值)split_part(col_name, '_', 1)拆分列名的第一部分(A/B),作为upper_case字段split_part(col_name, '_', 2)拆分列名的第二部分(a/b),作为lower_case字段
方法二:使用UNNEST数组展开
SELECT unnest(array['A', 'B', 'A', 'B']) AS upper_case, unnest(array['a', 'a', 'b', 'b']) AS lower_case, unnest(array[A_a, B_a, A_b, B_b]) AS value FROM original_table;
原理说明:
- 构造三个对应数组,分别存储
upper_case、lower_case的固定值,以及源表的列值 UNNEST同时展开三个数组,实现行的映射
替换代码中的original_table为你的实际表名即可执行,两种方法都能得到你需要的长格式结果。
内容的提问来源于stack exchange,提问作者Dieu94
相关产品推荐
相关产品推荐

