CREATE TABLE mesure_compteur ( -- TODO ; revoir procédures d'injection des 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 1, 2; 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 1, 2; 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 1, 2 order by "date" desc