Я хочу, чтобы в запросе все значения 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)
)
Если для group_id установлено значение id2, когда предыдущая точка удалена более чем на 5 минут, в противном случае - 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 минут. В этом случае их должно быть две разные группы.
id1
, поtms
или поid1, id2, tms
? - person Erwin Brandstetter   schedule 16.12.2015