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
相关产品推荐
相关产品推荐

