【发布时间】:2015-12-16 14:05:34
【问题描述】:
我想在请求中用最后一个已知值填充所有 Null 值。 当它在表中而不是在请求中时,很容易:
如果我按如下方式定义和填写表格:
CREATE TABLE test_fill_null (
date INTEGER,
value INTEGER
);
INSERT INTO test_fill_null VALUES
(1,2),
(2, NULL),
(3, 45),
(4,NULL),
(5, null);
SELECT * FROM test_fill_null ;
date | value
------+-------
1 | 2
2 |
3 | 45
4 |
5 |
那我只需要这样填写:
UPDATE test_fill_null t1
SET value = (
SELECT t2.value
FROM test_fill_null t2
WHERE t2.date <= t1.date AND value IS NOT NULL
ORDER BY t2.date DESC
LIMIT 1
);
SELECT * FROM test_fill_null;
date | value
------+-------
1 | 2
2 | 2
3 | 45
4 | 45
5 | 45
但是现在,我有一个请求,就像这个:
WITH
pre_table AS(
SELECT
id1,
id2,
tms,
CASE
WHEN tms - lag(tms) over w < interval '5 minutes' THEN NULL
ELSE id2
END as group_id
FROM
table0
window w as (partition by id1 order by tms)
)
当前一个点距离超过 5 分钟时,group_id 设置为 id2,否则为 null。通过这样做,我希望得到一组彼此跟随不到 5 分钟的点,并且每组之间的间隔超过 5 分钟。
那我不知道该怎么办了。我试过了:
SELECT distinct on (id1, id2)
t0.id1,
t0.id2,
t0.tms,
t1.group_id
FROM
pre_table t0
LEFT JOIN (
select
id1,
tms,
group_id
from pre_table t2
where t2.group_id is not null
order by tms desc
) t1
ON
t1.tms <= t0.tms AND
t1.id1 = t0.id1
WHERE
t0.id1 IS NOT NULL
ORDER BY
id1,
id2,
t1.tms DESC
但在最终结果中,我有一些连续两个点相距超过 5 分钟的组。在这种情况下,它们应该是两个不同的组。
【问题讨论】:
-
所以每 5 分钟有一个 NULL 值,同一组可以无限期地存在,对吗?一如既往:请您的 Postgres 版本。一开始的好测试用例结果证明不适用于您的实际问题。为您的实际问题提供测试用例会更有意义。
-
是的。我的版本是 9.3.10。我无法按原样提供数据。如果你愿意,我会用相同的模型制作一些假数据。
-
假定的基本行顺序也未定义。您是通过
id1、tms还是id1, id2, tms订购? -
@Erwin Brandstetter:对我帮助最大的是我可以在窗口上使用计数,并且它会随着每个非空值而增加。我应该编辑我的问题的标题以反映这一点吗?
-
如果您能想出一个更贴近问题本质的标题,请继续!
标签: sql postgresql window-functions gaps-and-islands