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

SQL如何合并除部分字段外数据一致的两行记录?

如何合并表中互补NULL的重复记录

当然可以实现!这种场景在数据清洗中特别常见——当你有两条几乎一致的记录,只是部分字段互为NULL/有效值时,我们可以用SQL的分组和聚合函数轻松搞定。

针对你给出的示例表,我们可以用MAX()函数配合GROUP BY来完成合并:

SELECT 
  MODELNAME,
  MAX(`PC Score`) AS `PC Score`,
  MAX(`Rated Score`) AS `Rated Score`,
  MAX(`Prod Score`) AS `Prod Score`,
  MAX(Temp) AS Temp,
  MAX(Temp1) AS Temp1,
  MAX(Temp2) AS Temp2
FROM your_table_name -- 替换成你的实际表名
GROUP BY MODELNAME, `Rated Score`, `Prod Score`;

为什么这个方法有效?

MAX()函数的核心特性是自动忽略NULL值,只取分组内的非NULL有效值。比如:

  • 对于PC Score字段,分组里一条是1234、一条是NULL,MAX()会返回1234
  • 对于Temp字段,分组里一条是NULL、一条是2356,MAX()会返回2356

这样就正好把两条互补的记录合并成了一行完整的数据。

另一种可选方案:用COALESCE+窗口函数

如果你的场景中可能存在多于两条的互补记录,或者需要保留更多行的上下文,可以用COALESCE结合窗口函数(比如LAG/LEAD)来实现:

SELECT DISTINCT
  MODELNAME,
  COALESCE(`PC Score`, LAG(`PC Score`) OVER (PARTITION BY MODELNAME, `Rated Score`, `Prod Score` ORDER BY `PC Score` DESC)) AS `PC Score`,
  `Rated Score`,
  `Prod Score`,
  COALESCE(Temp, LEAD(Temp) OVER (PARTITION BY MODELNAME, `Rated Score`, `Prod Score` ORDER BY `PC Score` DESC)) AS Temp,
  COALESCE(Temp1, LEAD(Temp1) OVER (PARTITION BY MODELNAME, `Rated Score`, `Prod Score` ORDER BY `PC Score` DESC)) AS Temp1,
  COALESCE(Temp2, LEAD(Temp2) OVER (PARTITION BY MODELNAME, `Rated Score`, `Prod Score` ORDER BY `PC Score` DESC)) AS Temp2
FROM your_table_name;

不过对于你描述的两行互补的简单场景,第一种GROUP BY+MAX()的方法更简洁高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:40:33