CREATE TABLE mesure_gauge ( -- 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_gauge ("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" = 'G' -- TODO : prévoir cette info dans captation
    );

SELECT add_retention_policy('mesure_gauge', INTERVAL '6 months'); -- on ne garde les données brutes que 6 mois

CREATE MATERIALIZED VIEW mesure_gauge_heure -- valeurs par heure
WITH (timescaledb.continuous) AS
SELECT 
  id_captation,
  time_bucket(INTERVAL '1 HOUR', mg."date") AS "date",
  time_weight('linear', mg."date", mg.valeur) AS valeur_temporelle,
  MAX(mg.valeur),
  MIN(mg.valeur)
FROM mesure_gauge mg
GROUP BY id_captation, time_bucket(INTERVAL '1 hour', 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_gauge_heure',
  start_offset => INTERVAL '1 month',
  end_offset => INTERVAL '1 day',
  schedule_interval => INTERVAL '1 hour'
);

SELECT add_retention_policy('mesure_gauge_heure', INTERVAL '5 years'); -- on ne garde les données par h que 5 ans

CREATE MATERIALIZED VIEW mesure_gauge_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,
  MAX(mg.max),
  MIN(mg.min)
FROM mesure_gauge_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_gauge_jour',
  start_offset => INTERVAL '1 month',
  end_offset => INTERVAL '1 day',
  schedule_interval => INTERVAL '1 hour'
);

SELECT add_retention_policy('mesure_gauge_jour', INTERVAL '20 years'); -- on ne garde les données par h que 20 ans

-- ex. select
select 
  mgh.id_captation,
  time_bucket(INTERVAL '1 DAY', mgh."date") AS "date", -- 1 jour et pas seulement une heure
  average(rollup(valeur_temporelle)) AS moyenne -- rollup pour avour le concaténation des valeur_temporelle
from mesure_gauge_heure mgh
where mgh.id_captation = 59 -- puissance PAC
group by mgh.id_captation, time_bucket(INTERVAL '1 DAY', mgh."date")
order by "date" desc
limit 1000;