【问题标题】:SQL: Substitute NAs with last observationSQL:用最后一次观察替换 NA
【发布时间】:2026-02-10 05:50:01
【问题描述】:

我有一张像这样的大桌子:

Date   Price1   Price2
1      13       14.9
2      13.1     NULL
3      NULL     14
4      NULL     14.5
5      13       14

我想填充 NA,以便我的 SQL 表如下所示:

Date   Price1   Price2
1      13       14.9
2      13.1     14.9
3      13.1     14
4      13.1     14.5
5      13       14

我对 SQL 很陌生,所以请原谅。我在这里搜索,似乎您可以在 R 中执行此操作,但我应该如何在 SQL 中执行此操作。

我正在使用 Microsoft SQL Server 管理。此外,我似乎无法弄清楚如何正确插入表格,他们不会让我发布照片。所以,对格式感到抱歉。

【问题讨论】:

  • 你如何决定放哪个值而不是 NA?我看到您将 Price1 NAs 替换为 13.1,将 Price2 NAs 替换为 14.9,但您是如何得出这个确切数字的?从日期之前的最后一个价格开始?
  • 如果是NA,替换为最后一天的可用价格。
  • 好吧,那么@Chandu 提供的答案就可以了,除非您使用的是 Sql Server 2000。
  • 我正在使用 Microsoft SQL Server 2012。我还注意到在我的表中它不是 N/A,而是 NULL。所以,我想弄清楚为什么它不起作用。

标签: sql-server sql-server-2012


【解决方案1】:

试试这个:

UPDATE a
  SET a.Price1 = b.Price1
  FROM <YOUR-TABLE> a CROSS APPLY 
    (
        SELECT TOP 1 Price1
          FROM <YOUR-TABLE> b
        WHERE a.Date > b.Date
          AND Price1 <> 'NA'
            ORDER BY b.Date DESC
    ) b

    UPDATE a
  SET a.Price2 = b.Price2
  FROM <YOUR-TABLE> a CROSS APPLY 
    (
        SELECT TOP 1 Price2
          FROM <YOUR-TABLE> b
        WHERE a.Date > b.Date
          AND Price2 <> 'NA'
            ORDER BY b.Date DESC
    ) b

【讨论】:

  • 然后对整个表重复,每次更改一行。布莱克。
  • @Aaron Bertrand:我该怎么做?我是初学者,请多多包涵。
  • 您会使用触发器,但我绝不建议这样做。当您查询数据而不是以这种方式存储数据时填充这些列难道不够吗?您可以在查询或表示层中执行此操作,而无需运行更新或维护此依赖于其他行的数据。
最近更新 更多