From f8a64e4dfddefb3e51b1ea94ef844cd97e363b3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20=C3=85hall?= Date: Wed, 24 Jul 2024 10:27:21 +0200 Subject: [PATCH] Added last values for table datapoint, update to current latest values and trigger for future values --- sql/00026.sql | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 sql/00026.sql diff --git a/sql/00026.sql b/sql/00026.sql new file mode 100644 index 0000000..719dccd --- /dev/null +++ b/sql/00026.sql @@ -0,0 +1,56 @@ +/* Adding last values to the datapoint table since they are a regularly used value. */ +ALTER TABLE public.datapoint ADD COLUMN last_value_int int8 NULL; +ALTER TABLE public.datapoint ADD COLUMN last_value_string varchar NULL; +ALTER TABLE public.datapoint ADD COLUMN last_value_datetime timestamptz NULL; + + + +/* Once-run query to update it to the latest, to avoid user having to wait for the next entry. */ +UPDATE public.datapoint AS dp +SET + last_value_int = dpv.value_int, + last_value_string = dpv.value_string, + last_value_datetime = dpv.value_datetime +FROM ( + SELECT + dp.id AS datapoint_id, + dpv.value_int, + dpv.value_string, + dpv.value_datetime + FROM public.datapoint dp + LEFT JOIN ( + SELECT + *, + row_number() OVER (PARTITION BY "datapoint_id" ORDER BY ts DESC) AS rn + FROM datapoint_value + ) dpv ON dpv.datapoint_id = dp.id AND rn = 1 +) AS dpv +WHERE + dpv.datapoint_id = dp.id; + + + +/* A trigger keeps the value current without bugs introduced in software missing the entry. */ +CREATE OR REPLACE FUNCTION datapoint_entry() + RETURNS TRIGGER + LANGUAGE PLPGSQL + AS +$$ +BEGIN + UPDATE public.datapoint + SET + last_value_int = NEW.value_int, + last_value_string = NEW.value_string, + last_value_datetime = NEW.value_datetime + WHERE + id = NEW.datapoint_id; + + RETURN NEW; +END; +$$; + +CREATE TRIGGER datapoint_entry + AFTER INSERT + ON public.datapoint_value + FOR EACH ROW + EXECUTE PROCEDURE datapoint_entry();