使用同一列中的最新值填充 NULL 值

Posted

技术标签:

【中文标题】使用同一列中的最新值填充 NULL 值【英文标题】:Populate NULL value with most recent value from the same column 【发布时间】:2015-03-03 18:35:01 【问题描述】:

我正在尝试用该列中最近的非 NULL 值填充列中的 NULL 值。例如,在下面的示例中,我希望 FR 和第一个 SPR 值的 IG 列为“1”,但最终 SPR 值为“0”。

当我试图跟踪给定 issue_ID 的 IG 变量随时间的变化时,我需要这样做以确保我不会用另一个 issue_ID 的结果填充一个 issue_ID 的 NULL 值。

我已经能够使用以下代码更新 NULL 值。问题是这无法识别 last 非 NULL 值。它似乎只是将 IG 值用于相关行之前的 any 非 NULL 值。

例如,对于包含 SPR 和“2002-12-02”的行,IG 变量填充为“1”,而不是所需的“0”。

我们将非常感谢提供任何帮助。

示例代码:

UPDATE ratings_base a
    SET ig =  b.ig
    FROM 
    (
     SELECT issue_id,
            rating,
            date,
            IG
    FROM ratings_base
    WHERE agency = 'MR' 
    ) b
WHERE a.rating IS NOT NULL
AND a.agency != 'MR'
AND b.date < a.date
AND a.issue_id = b.issue_id;

示例数据:

Issue_ID | Agency |    Date    | Rating | IG
---------------------------------------------
1        | MR     | 2002-05-29 |   8    | 1 
1        | MR     | 2002-08-14 |   8    | 1
1        | FR     | 2002-08-19 |   11   | NULL
1        | SPR    | 2002-09-23 |   9    | NULL
1        | MR     | 2002-10-02 |   9    | 1
1        | MR     | 2002-11-26 |   11   | 0
1        | SPR    | 2002-12-02 |   12   | NULL
2        | MR     | 2002-08-14 |   8    | 1
2        | MR     | 2002-08-17 |   8    | 1

【问题讨论】:

WHERE a.rating IS NOT NULL,你确定IS NULL 不应该在这里吗? 嗨 Giorgi,很抱歉,但在我的完整数据集中,有些情况下“评级”变量为 NULL(在我的示例中未显示)。这不是我的代码中的错字。我可能还想为“IG”变量为空的位置添加一个条件。谢谢 对不起,我以为是 IG 而不是 null 【参考方案1】:

如何将子查询移入update,并确保正确排序以获得最新的ig值:

UPDATE ratings_base a
SET ig = (
  SELECT b.ig
  FROM ratings_base b
  WHERE a.issue_id = b.issue_id
  AND b.agency = 'MR' 
  AND b.date < a.date
  ORDER BY b.date DESC
  LIMIT 1
)
WHERE a.rating IS NOT NULL
AND a.agency != 'MR';

【讨论】:

以上是关于使用同一列中的最新值填充 NULL 值的主要内容,如果未能解决你的问题,请参考以下文章

使用 MySQL 或 H2 将空值替换为列中的最新值

如何从 MySQL 列中的 JSON 文档中获取最新值?

Oracle - 用另一列中的值填充列中的空值

从数据库中选择一列中的值不同且限制为 5 个最新的行

使用 pyspark 跟踪和查找数据框中的最新值

使用另一列中的值填充空白 Excel 单元格?