如何利用自连接或函数填充TIMELINE表中缺失的NUMBER值?
空值填充的实现方案
一、窗口函数(推荐,性能更优)
大多数现代SQL数据库(如PostgreSQL、Oracle、SQL Server 2022+、MySQL 8.0+)支持窗口函数,用LAST_VALUE结合IGNORE NULLS可直接实现需求:
SELECT TIMELINE, DATE, LAST_VALUE(NUMBER) OVER ( ORDER BY TIMELINE ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW IGNORE NULLS ) AS FILLED_NUMBER FROM your_table;
如果你的数据库不支持IGNORE NULLS(如MySQL 8.0早期版本),可以用自定义变量模拟逻辑:
SELECT TIMELINE, DATE, @last_valid_number := CASE WHEN DATE IS NOT NULL THEN NUMBER ELSE @last_valid_number END AS FILLED_NUMBER FROM your_table, (SELECT @last_valid_number := NULL) AS init ORDER BY TIMELINE;
这个逻辑是按TIMELINE顺序遍历数据:遇到有有效DATE的行,就更新变量为当前NUMBER;空DATE的行直接沿用之前的变量值——如果此前没有有效NUMBER,变量保持NULL,完全匹配需求。
二、自连接实现
也可以通过自连接找到每行TIMELINE对应的最大非NULL DATE(且该DATE小于等于当前TIMELINE),再关联对应的NUMBER:
SELECT t1.TIMELINE, t1.DATE, t2.NUMBER AS FILLED_NUMBER FROM your_table t1 LEFT JOIN your_table t2 ON t2.DATE = ( SELECT MAX(DATE) FROM your_table WHERE DATE <= t1.TIMELINE AND DATE IS NOT NULL );
注意:如果子查询找不到符合条件的DATE,t2.NUMBER会返回NULL,正好满足“最近前置DATE对应的NUMBER为NULL则保持NULL”的要求。但自连接在数据量较大时性能会远低于窗口函数,因为每行都要执行一次子查询。
内容的提问来源于stack exchange,提问作者user18466310
相关产品推荐
相关产品推荐

