timescaledb/sql/3_compteur.sql
2026-03-13 16:58:15 +01:00

70 lines
2.7 KiB
SQL

CREATE TABLE mesure_compteur ( -- TODO ; revoir précudes d'injection de données pour faire la différence entre gauge et compteur
"date" TIMESTAMPTZ,
id_captation INT NOT NULL,
valeur float4 NOT NULL
) WITH (
tsdb.hypertable,
timescaledb.segmentby = 'id_captation',
timescaledb.orderby='date DESC'
);
INSERT INTO mesure_compteur ("date", id_captation, valeur)
SELECT m."date", m.id_captation, m.valeur
FROM mesure m
WHERE m.id_captation IN (
SELECT c.id_captation
FROM captation c
WHERE c."type" = 'C' -- TODO : prévoir cette info dans captation
);
SELECT add_retention_policy('mesure_compteur', INTERVAL '6 months'); -- on ne garde les données brutes que 6 mois
CREATE MATERIALIZED VIEW mesure_compteur_heure -- valeurs par heure
WITH (timescaledb.continuous) AS
SELECT
id_captation,
time_bucket(INTERVAL '1 hour', mc."date") AS "date",
counter_agg(mc."date", mc.valeur) AS valeur_temporelle
FROM mesure_compteur mc
GROUP BY
id_captation,
time_bucket(INTERVAL '1 hour', mc."date");
SELECT add_continuous_aggregate_policy('mesure_compteur_heure', -- On met à jour les données tt les h en relisant les données brutes entre 1 mois et 1 jour
start_offset => INTERVAL '1 month',
end_offset => INTERVAL '1 day',
schedule_interval => INTERVAL '1 hour');
SELECT add_retention_policy('mesure_compteur_heure', INTERVAL '5 years'); -- on ne garde les données par h que 5 ans
CREATE MATERIALIZED VIEW mesure_compteur_jour -- valeurs par jour
WITH (timescaledb.continuous) AS
SELECT
id_captation,
time_bucket(INTERVAL '1 DAY', mg."date") AS "date",
rollup(valeur_temporelle) AS valeur_temporelle
FROM mesure_compteur_heure mg
GROUP BY id_captation, time_bucket(INTERVAL '1 DAY', mg."date");
SELECT add_continuous_aggregate_policy( -- On met à jour les données tt les h en relisant les données brutes entre 1 mois et 1 jour
'mesure_compteur_jour',
start_offset => INTERVAL '1 month',
end_offset => INTERVAL '1 day',
schedule_interval => INTERVAL '1 hour'
);
SELECT add_retention_policy('mesure_compteur_jour', INTERVAL '20 years'); -- on ne garde les données par h que 20 ans
-- ex. select
SELECT
mch.id_captation,
time_bucket(INTERVAL '1 DAY', mch."date") AS "date", -- 1 jour et pas seulement une heure
delta(rollup(mch.valeur_temporelle)) AS consommation,
rate(rollup(mch.valeur_temporelle)) * 3600 AS debit_moyen,
irate_left(rollup(mch.valeur_temporelle)) * 3600 AS debit_instantane,
first_val(rollup(mch.valeur_temporelle)) AS index_debut,
last_val(rollup(mch.valeur_temporelle)) AS index_fin
FROM mesure_compteur_heure mch
where mch.id_captation = 89 -- HP
group by mch.id_captation, time_bucket(INTERVAL '1 DAY', mch."date")
order by "date" desc