如何用同列中最近的非空值更新SQL临时表内的Null值?
解决方案:用最近非空值填充Null
针对你的临时表#ORDERS,我们需要按WAREHOUSE和CATEGORY_NUMBER分组,在每个分组内按YEARMONTH排序,用**历史最近的非空VALUE**来填充Null值。以下是两种适用于SQL Server的实现方式(你的临时表语法是SQL Server风格):
方法1:使用LAST_VALUE(SQL Server 2022+)
SQL Server 2022及以后版本支持IGNORE NULLS参数,这让我们可以直接用窗口函数快速定位最近非空值:
WITH FilledValues AS ( SELECT YEARMONTH, WAREHOUSE, CATEGORY_NUMBER, VALUE, LAST_VALUE(VALUE) IGNORE NULLS OVER ( PARTITION BY WAREHOUSE, CATEGORY_NUMBER ORDER BY YEARMONTH ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS LatestNonNullValue FROM #ORDERS ) UPDATE FilledValues SET VALUE = LatestNonNullValue WHERE VALUE IS NULL;
关键说明:
PARTITION BY WAREHOUSE, CATEGORY_NUMBER:确保我们只在同一个仓库+分类的范围内查找最近值,不会跨分组干扰ORDER BY YEARMONTH:按时间顺序排序,保证取的是当前行之前最近的非空值IGNORE NULLS:跳过中间的Null记录,直接定位到有效的非空值
方法2:兼容旧版本SQL Server(2019及以下)
如果你的SQL Server版本不支持IGNORE NULLS,可以用自连接+ROW_NUMBER()来实现:
WITH RankedNonNulls AS ( SELECT o1.YEARMONTH, o1.WAREHOUSE, o1.CATEGORY_NUMBER, o1.VALUE, o2.VALUE AS LatestNonNullValue, ROW_NUMBER() OVER ( PARTITION BY o1.WAREHOUSE, o1.CATEGORY_NUMBER, o1.YEARMONTH ORDER BY o2.YEARMONTH DESC ) AS rn FROM #ORDERS o1 LEFT JOIN #ORDERS o2 ON o1.WAREHOUSE = o2.WAREHOUSE AND o1.CATEGORY_NUMBER = o2.CATEGORY_NUMBER AND o2.YEARMONTH <= o1.YEARMONTH AND o2.VALUE IS NOT NULL WHERE o1.VALUE IS NULL ) UPDATE RankedNonNulls SET VALUE = LatestNonNullValue WHERE rn = 1;
关键说明:
- 自连接表,找到每个Null行时间之前的所有非空值记录
ROW_NUMBER()按时间倒序排序,取距离当前行最近的那一条(rn=1)- 仅更新原本为Null的行,避免覆盖已有有效值
验证结果
执行完更新后,用以下查询确认效果:
SELECT * FROM #ORDERS ORDER BY WAREHOUSE, CATEGORY_NUMBER, YEARMONTH;
针对你提供的样本数据,ABC仓库1001分类的Null值会被填充为:
- 201712 → 84(来自201711的非空值)
- 201802 → 82(来自201801的非空值)
- 201803 → 82(来自201801的非空值)
内容的提问来源于stack exchange,提问作者Json Brent
相关产品推荐
相关产品推荐

