我有一个数据集,它有一些缺失值。这是一个时间序列数据集,因此我想用前一天的值更新缺失值。
我创建了一个视图,其中包含前两天的值的滞后。见下图:
销售日期 | 每日操作 | lag_op1 | lag_op2 |
---|---|---|---|
2013-01-03 | 92.97 | 93.14 | 空 |
2013-01-04 | 93.12 | 92.97 | 93.14 |
2013-01-05 | 空 | 93.12 | 92.97 |
我的主表包含 300 万条记录,我想使用带有滞后操作变量的视图来估算主表中的缺失值。
我运行了这段代码:
update wholetest
set daily_op = (select lag_op1 from lag_op where lag_op.sale_date = wholetest.sale_date)
where daily_op is null;
这需要一段时间,所以我跑向目标,然后我回来,它仍在运行。它的运行时间超过 1 小时,所以我认为即使它有很多记录,它也无法正常工作。
我尝试在 Wholetest.sale_date 之后添加“limit 1”选项,但这似乎不起作用。 (即具有滞后变量的视图具有一个不同的日期)。请让我知道我的代码做错了什么。
wholetest.sale_date
上是否有
唯一索引(或PK)?否则,您可能会得到任意结果 - 增加的成本与重复项的数量成正比。换句话说:昂贵的废话。
使用所述唯一索引,查询应该很快 - 好吧,300 万行将需要几秒钟。除非你搞乱了你未公开的观点。无论哪种方式,您都不需要为此提供视图。只是:
UPDATE wholetest w
SET daily_op = (
SELECT daily_op
FROM wholetest w1
WHERE w1.sale_date < w.sale_date
ORDER BY w1.sale_date DESC
LIMIT 1
)
WHERE w.daily_op IS NULL;
唯一的另一件事(除了存储、RAM 和/或 CPU 的损坏或严重争用之外)是锁定问题。通常在长时间运行的事务中并发写入表。在这种情况下,请检查系统视图
pg_stat_activity
。参见: