Добавить выборку по периоду наверное можно, но там запрос будет далеко не тривиальный, т.к. надо учесть что в пределы периода могут попасть только "пустые" значения, а вытянуть значение за пределами периода будет не просто. Может что подскажут гуру по SQL. По поводу вставки не нулевых значений в триггере - это где-то так
CREATE TRIGGER table1_tr
BEFORE INSERT
ON public.table1 FOR EACH ROW
EXECUTE PROCEDURE public.f_insert();
CREATE OR REPLACE FUNCTION public.f_insert (
)
RETURNS TRIGGER AS
$body$
BEGIN
IF NEW.t IS NULL THEN
BEGIN
SELECT t INTO NEW.t FROM table1 WHERE time_field=(SELECT MAX(time_field) FROM table1 WHERE time_fieldNEW.time_field AND t IS NOT NULL);
EXCEPTION
WHEN NO_DATA_FOUND THEN
--не найдено значения t, что-то предпринять или будет null;
END;
END IF;
IF NEW.h IS NULL THEN
BEGIN
SELECT h INTO NEW.h FROM table1 WHERE time_field=(SELECT MAX(time_field) FROM table1 WHERE time_fieldNEW.time_field AND h IS NOT NULL);
EXCEPTION
WHEN NO_DATA_FOUND THEN
--не найдено значения h, что-то предпринять или будет null;
END;
END IF;
IF NEW.p IS NULL THEN
BEGIN
SELECT p INTO NEW.p FROM table1 WHERE time_field=(SELECT MAX(time_field) FROM table1 WHERE time_fieldNEW.time_field AND p IS NOT NULL);
EXCEPTION
WHEN NO_DATA_FOUND THEN
--не найдено значения h, что-то предпринять или будет null;
END;
END IF;
RETURN NEW;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;
тут триггер только на Insert, если надо учесть и возможность правки, то добавить событие Update.