如何在PostgreSQL中使用rollup函数实现列值拆分为重复新行
解决方案
你需要的是列转行效果,不需要使用ROLLUP函数(ROLLUP用于生成多级聚合汇总行,和你的需求场景不匹配),PostgreSQL中使用unnest数组展开函数可以快速实现需求,性能也优于union all等其他写法。
基础实现(对应你给出的A~H列示例)
假设你的表名为your_table,查询代码如下:
SELECT t.A, t.B, unnest(ARRAY[t.C, t.D, t.E, t.F, t.G, t.H]) AS metric_value FROM your_table t;
运行后每一条原始数据会生成6行结果,每行保留A、B列的原值,依次带出C、D、E、F、G、H的取值,完全匹配你要的输出格式。
扩展到前7个固定列、后6个度量列的场景
直接把需要固定展示的7个列全部放在SELECT子句中,unnest的数组里按顺序填入你要拆分的6个度量列即可:
SELECT t.col1, t.col2, t.col3, t.col4, t.col5, t.col6, t.col7, -- 替换为你实际的前7个固定列名 unnest(ARRAY[t.col8, t.col9, t.col10, t.col11, t.col12, t.col13]) AS metric_value -- 替换为你实际的6个度量列名 FROM your_actual_table t;
附加说明
- 如果6个度量列的数据类型不一致,需要统一转成相同类型再放入数组,比如统一转成文本类型:
unnest(ARRAY[t.col8::text, t.col9::text, t.col10::text, t.col11::text, t.col12::text, t.col13::text]) AS metric_value - 如果你需要同时标识当前行对应的原始度量列名,可以用多数组同步展开的写法:
SELECT t.A, t.B, m.metric_name, m.metric_value FROM your_table t, unnest( ARRAY['C','D','E','F','G','H'], -- 按顺序填写度量列的列名 ARRAY[t.C, t.D, t.E, t.F, t.G, t.H] ) AS m(metric_name, metric_value);
内容的提问来源于stack exchange,提问作者AidenPy
相关产品推荐
相关产品推荐

