You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用自连接或函数填充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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 10:18:33