Re: Ayuda con consulta

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

In response to

Browse pgsql-es-ayuda by date

  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.