PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 04/07/2014 11:16:01

Fanch
Membre

Recherche date d'atteinte d'un seuil

Bonjour,

Mon problème se pose sur des données climatiques de la forme:

id     dat_meteo        value
231  "2007-05-08"    15.35
232  "2007-05-09"    16.4
233  "2007-05-10"    17.8
234  "2007-05-11"    16.25
235  "2007-05-12"    16.35
236  "2007-05-13"    18.4
237  "2007-05-14"    13.7

Il s'agit d'une table ou à chaque jour est associée une valeur d'un paramètre, ici la température moyenne du jour. J'aimerais construire une fonction qui me permette, à partir d'une date initiale, de trouver la date à laquelle la somme des valeurs cumulées depuis cette date atteint au moins 200. Typiquement j'ai une date de floraison, par exemple le 2007-05-08, je veux connaitre la date 2007-05-08 + 200 degrés cumulés.

Le codage de fonction sous postgres est encore bien mystérieux pour moi, je ne sais pas vraiment comment m'y prendre ...
Merci

Hors ligne

#2 04/07/2014 20:13:29

rjuju
Administrateur

Re : Recherche date d'atteinte d'un seuil

Bonjour,

Vous pouvez le faire en une seule requête, par exemple avec vos donnée trouver la date 2007-05-09 +70° cumulés :

SELECT dat_meteo
FROM (
    SELECT dat_meteo, sum(value) OVER (ORDER BY dat_meteo) as cumul
    FROM latable
    WHERE dat_meteo > ('2007-05-09')
) s
WHERE s.cumul >= 70
ORDER BY dat_meteo
LIMIT 1;

Hors ligne

#3 16/07/2014 14:10:17

Fanch
Membre

Re : Recherche date d'atteinte d'un seuil

Bonjour,
Merci pour votre aide, ci dessous la fonction finalement éditée :

DROP FUNCTION IF EXISTS fct_return_datestplus(date, integer, double precision) CASCADE;
CREATE OR REPLACE FUNCTION fct_return_datestplus(p_dat_initiale date, p_station integer, p_st double precision)
  RETURNS date AS
$BODY$
  DECLARE
  v_date date;
  BEGIN
      -- récupération de la date correspondante
	SELECT INTO v_date dat_meteo
	FROM (
	    SELECT dat_meteo, sum(tmoy) OVER (ORDER BY dat_meteo) as cumul
	    FROM qry_var_tmoy
	    WHERE dat_meteo > (p_dat_initiale) AND id_station = p_station
	) s
	WHERE s.cumul >= p_st
	ORDER BY dat_meteo
	LIMIT 1;
    RETURN v_date;
  END 
;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
COMMENT ON FUNCTION fct_return_datestplus(date, integer, double precision) IS '
fct_return_datestplus: fonction permettant de calculer la date a partir d''une 
date initiale et d''un cumul de temperature depuis cette date.
Remarques :
- le cumul commence le lendemain de la date initiale renseignee > (p_dat_initiale).
- pas de prise en compte d''une temperature de base ou temperature max 
EXAMPLE 1 :
SELECT fct_return_datestplus(''2007-05-08'', 1801, 30);
';

qry_var_tmoy est une table qui regroupe les température moyennes quotidiennes,
id_station est un identifiant de station meteo

Hors ligne

Pied de page des forums