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

时间:2015-03-03 18:35:01

标签: postgresql postgresql-9.3

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

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

我已经能够使用以下代码更新NULL值。问题是,这无法识别最后非NULL值。它似乎只是将任何非NULL值的IG值取在相关行之前。

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

任何帮助都会 HUGELY 赞赏。

示例代码:

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

1 个答案:

答案 0 :(得分: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';