70 lines
2.7 KiB
SQL
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 |