From: | Emanuel Calvo Franco <postgres(dot)arg(at)gmail(dot)com> |
---|---|
To: | Jose Gomez-Dans <jgomezdans(at)gmail(dot)com> |
Cc: | pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: Ayuda con consulta |
Date: | 2009-04-13 13:10:40 |
Message-ID: | f205bb120904130610j2af521e0ga347715ee6d06cb1@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
El día 11 de abril de 2009 12:21, Jose Gomez-Dans
<jgomezdans(at)gmail(dot)com> escribió:
> Hola,
>
> Soy bastante bisoño en esto del SQL. Estoy intentando hacer una consulta que
> calcula el un índice de riesgo de incendios forestales (índice de Nesterov,
> hay información aquí: <http://fire.cambriacsd.org/nesterov.php>). En
> esencia, tengo una tabla con una serie de variables climáticas diarias. Para
> cada día, calculo un valor, y lo sumo al valor del índice del día anterior,
> a no ser que se cumpla una condición en una columna (precipitación>3mm), en
> cuyo caso, el índice se pone a 0. Hasta ahora, he viniendo haciendo este
> cálculo fuera de Postgres, pero me gustaría hacerlo en una consulta. En C,
> mi algoritmo es algo así como el código de abajo (es muy sencillo). Cómo
> puedo implementar esto en SQL?
>
> float *nesterov_index ( float *temp, float *dew_point, float *prec )
> {
> /********************************************************/
> /* A function to calculate the Nesterov Index (NI) */
> /* from daily temperature, dew point and precipitation */
> /* Function by J Gomez-Dans (KCL) */
> /********************************************************/
>
> int doy ;
> float *nesterov = (float*) malloc ( sizeof(float)*365) ; /*All years have
> 365 days*/
> for (doy=0; doy<365; doy++) {
> if (prec[doy]<3.)
> {
> nesterov[doy] = nesterov[doy] + temp[doy]*(temp[doy]-dew_point[doy])
> ;
> }
> else
> { /*Rain, reset index */
> nesterov[doy] = 0.0 ;
> }
> }
> return nesterov ;
> }
>
Recordá que Postgresql permite funciones en C, las tendrías que compilar
como shared object y devolviendo un Datum.
Respecto a hacerlo en SQL sería bastante sencillo hacer una función en PLSQL
para esto. Inclusive podrías devolver un SET OF a fin de que la
consulta se la hagas al resultado de la funcion, por ejemplo:
select * from nesterov();
En teoría nesterov te devuelve un solo dato de acuerdo a la fecha now()
El problema que observo es que para pasarlo a una funcion de PLpgsql,
los paramá-
metros tienen varios valores, por lo que podrías para hacerlo más sencillo tener
los mismos en una tabla para ir haciendo los calculos utilizando estos.
--
Emanuel Calvo Franco
Sumate al ARPUG !
(www.postgres-arg.org -
www.arpug.com.ar)
ArPUG / AOSUG Member
Postgresql Support & Admin
From | Date | Subject | |
---|---|---|---|
Next Message | Emanuel Calvo Franco | 2009-04-13 13:21:19 | Re: [pgsql-es-ayuda] Bloques anónimos. |
Previous Message | Terry Yapt | 2009-04-13 12:42:10 | Bloques anónimos. |