CREATE TABLE master.estado_movimiento_inventario
(
id integer NOT NULL,
eliminado boolean NOT NULL DEFAULT false,
fundamentacion text NOT NULL,
fecha timestamp without time zone NOT NULL,
id_empresa integer NOT NULL,
id_usuario integer NOT NULL,
id_estado integer NOT NULL,
id_movimiento integer NOT NULL,
se_debio_tramitar_hace bigint DEFAULT 0,
CONSTRAINT "PK15estadomovtec" PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
ALTER TABLE master.estado_movimiento_inventario
OWNER TO postgres;
Эта таблица отслеживает состояние каждого движения инвентаря в моей бизнес-логике. Таким образом, каждое движение, которое еще не закончено (нет никакого id_estado = 3 или id_estado = 4 для любого id_movimiento в таблице master.estado_movimiento_inventario) должно хранить в поле se_debio_tramitar_hace
своего последнего состояния разницу между now()
и fecha
поле каждый раз при выполнении запланированной задачи (Windows).
Запрос, который я построил для этого:
with update_time as(
SELECT distinct on(id_movimiento) id
from master.estado_movimiento_inventario
where id_movimiento not in (
select id_movimiento
from master.estado_movimiento_inventario
where id_estado = 2 or id_estado=3
) order by id_movimiento, id desc
)
update master.estado_movimiento_inventario mi
set se_debio_tramitar_hace= EXTRACT(epoch FROM now()::timestamp - mi.fecha )/3600
where mi.id in (select id from update_time);
Это работает, как и ожидалось, но я подозреваю, что это не оптимально, особенно в операции обновления, и вот мое самое большое сомнение: что оптимально при выполнении этой операции обновления:
Извините, если я не достаточно ясен, у меня нет большого опыта работы с базами данных, хотя я понял теорию позади, но не слишком много работал с ней.
Редактировать
Обратите внимание, что id_estado не уникален для id_movimiento, как показано на рисунке: