如何在SELECT语句中用前一行有效值填充当前行缺失的品牌信息?
解决方案
假设你的表名为cars,且存在一个用于确定行顺序的字段(比如自增主键id,SQL表本身是无序的,必须依赖这类字段保证顺序正确),可以使用以下SQL查询实现需求:
SELECT CONCAT( -- 获取到当前行为止最近的有效品牌 MAX(CASE WHEN NOT Car_Type LIKE 'null - %' THEN SUBSTRING_INDEX(Car_Type, ' - ', 1) END) OVER (ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), ' - ', -- 提取车型部分 SUBSTRING_INDEX(Car_Type, ' - ', -1) ) AS Car_Type FROM cars;
逻辑说明
- 提取有效品牌:通过
CASE判断,仅对非null -开头的行提取品牌部分(用SUBSTRING_INDEX取分隔符-前的内容)。 - 填充缺失品牌:使用
MAX()窗口函数,按行顺序从第一行到当前行的范围内,取最近的非null品牌值(非null品牌在对应组内唯一,MAX等价于获取最近的有效品牌)。 - 拼接结果:将填充后的品牌与车型部分(用
SUBSTRING_INDEX取分隔符-后的内容)拼接,得到完整的Car_Type值。
如果你的表中没有id这类顺序字段,需要先添加自增主键,或者确保有其他可确定行顺序的字段(比如创建时间),否则无法保证品牌填充的顺序正确。
内容的提问来源于stack exchange,提问作者user1463065
相关产品推荐
相关产品推荐

