我正在尝试使用该列中最新的非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
答案 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';