You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 17:39:04