Я хочу, в запросе, заполнить все значения Null последним известным значением. Когда это в таблице, а не в запросе, это легко:Как маркировать группы в postgresql, когда принадлежность группы зависит от предыдущей строки?
Если я определяю и заполнить свою таблицу следующим образом:
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 минут. В этом случае их должно быть две разные группы.
Так с одним значением NULL через каждые 5 минут, та же группа может быть увековечены на неопределенное время, не так ли? Как всегда: ваша версия Postgres, пожалуйста. И хороший тестовый пример с самого начала оказывается * не * применимым к вашей реальной проблеме. Было бы более разумно предоставить тестовый пример для вашей реальной проблемы. –
да точно. моя версия - 9.3.10. Я не могу предоставить данные так, как они есть. Я буду производить некоторые поддельные данные с той же моделью, если вы захотите. – Borbag
Предполагаемый основной порядок строк также не определен. Вы заказываете 'id1',' tms' или 'id1, id2, tms'? –