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

PostgreSQL如何合并整合同名单列非空多行为单行记录

PostgreSQL 同名单行数据合并方案

问题核心

同一姓名的成绩数据分散在多行,每行仅单科成绩为非空值、其余字段为null,需按姓名分组提取各字段有效非空值,丢弃冗余行的null信息。

原有写法的问题

之前使用array_agg按固定数组下标取值的方案存在稳定性风险:array_agg聚合后的元素顺序没有强制保证,一旦数据插入顺序、查询执行计划变化,会出现下标对应错位、取值错误的问题。

最优实现方法

直接使用普通聚合函数即可实现需求,MAX()/MIN()这类聚合函数会自动忽略null值,分组后会直接提取到对应科目的非空成绩,写法简洁且性能更高:

SELECT
  name,
  MAX(math_grade) AS math_grade,
  MAX(history_grade) AS history_grade,
  MAX(geography_grade) AS geography_grade
FROM temp1234
GROUP BY name;

方案说明

  • 无需依赖数组下标匹配,不存在顺序错位风险
  • null值会被聚合函数自动跳过,只会返回有效成绩值
  • 如果需要取最低分、平均分等其他聚合结果,把MAX()替换为MIN()、AVG()等对应聚合函数即可

复杂场景适配写法

如果存在同一人同一科有多个成绩、需要先剔除null再取值的场景,可以搭配array_remove实现,不过对当前测试场景属于冗余写法:

SELECT
  name,
  (array_remove(array_agg(math_grade), NULL))[1] AS math_grade,
  (array_remove(array_agg(history_grade), NULL))[1] AS history_grade,
  (array_remove(array_agg(geography_grade), NULL))[1] AS geography_grade
FROM temp1234
GROUP BY name;

针对提供的测试数据,上述两种写法执行后都能得到预期结果:姓名为John Smith的记录,数学成绩3、历史成绩4、地理成绩3,和目标效果完全一致。

内容的提问来源于stack exchange,提问作者Kolczan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 12:45:26