SQL如何按分组合并含空值的相同行并聚合各列非空值
按分组键合并同组非空值的SQL实现
核心实现逻辑
利用聚合函数自动忽略NULL值的特性,以col1为分组键对每一列做聚合,直接提取同组下的非空值,就能完成同组多行到单行的合并。
因为你的业务场景中,同一分组下每一列最多只有1个非空值,用MIN()/MAX()这类基础聚合函数就能直接拿到目标值,写法简单且兼容几乎所有SQL引擎。
注意:不要直接使用
COALESCE(col2, col3, col4)类的写法实现需求,这类函数是逐行判断取值,不会跨同组多行提取非空值,必须搭配GROUP BY的聚合逻辑才能完成跨行合并操作。
通用可直接运行的查询代码
SELECT col1, MIN(col2) AS col2, MIN(col3) AS col3, MIN(col4) AS col4 FROM 替换为你实际使用的表名 GROUP BY col1;
运行后即可得到目标合并结果:commonrow分组下,col2取到'one'、col3取到'two'、col4取到'three'的单行记录。
扩展适配(同列多非空值场景)
如果后续遇到同一分组下某列存在多个不同非空值,需要把所有值拼接展示的情况,可以根据你使用的数据库替换对应聚合函数:
- MySQL 5.7及以上:把
MIN(colx)替换为GROUP_CONCAT(DISTINCT colx SEPARATOR ',') - PostgreSQL、SQL Server 2017及以上:把
MIN(colx)替换为STRING_AGG(DISTINCT colx, ',') - Oracle:把
MIN(colx)替换为LISTAGG(DISTINCT colx, ',') WITHIN GROUP (ORDER BY colx)
内容的提问来源于stack exchange,提问作者canpoint
相关产品推荐
相关产品推荐

