Re: Creando funciones

From: alvherre <alvherre(at)commandprompt(dot)com>
To: Jorge Tornero <jorge(dot)tornero(at)cd(dot)ieo(dot)es>
Cc: pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Creando funciones
Date: 2010-05-27 15:44:26
Message-ID: 1274974606-sup-7998@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Excerpts from Jorge Tornero's message of jue may 27 05:01:58 -0400 2010:

Hola, bienvenido.

> Mi problema se centra en crear una función que me haga más sencillo
> obtener los coeficientes de regresión para un conjunto de datos.
>
> En mi caso, los datos de partida se podrían resumir como una columna con
> datos enteros de talla y otra de numeric de peso (aparte de otras
> consultas como fecha de muestreo, etc). Con esos campos y sus
> correspondientes datos, hago una consulta como:
>
> select
> exp(regr_intercept(ln(peso),ln(talla/10.0))),regr_slope(ln(peso),ln(talla/10.0)),regr_r2(ln(peso),ln(talla/10.0)) from biologicos where talla>0 and peso>0 and espcod='10156' and fecha between '2009/04/01' and '2009/6/30';
>
> Lo que me devuelve una "tablita" con los resultados que yo quiero, por
> ejemplo:
>
> exp | regr_slope | regr_r2
> ---------------------+------------------+------------------
> 0.00347024881569587 | 3.27125159141054 | 0.97753903864483
> (1 fila)

Hmm, lo que buscas es una función que tome todo el conjunto de entrada y
retorne en la salida un único registro con tres columnas, ¿verdad? Me
parece que eso no es posible. Lo primero que se me viene a la mente es
una función de agregación, pero éstas tienen solamente una columna de
salida, no tres. Ahora bien, quizás podrías arreglártelas para
construir una función de agregación que retorne un "record" en la
salida, pero la verdad es que no sé si eso será posible sin tener que
trabajar en C (cosa que no te recomiendo mucho).

Creo que lo más simple sería que crearas una vista; algo así:

create view regresion_biologicos as
select exp(regr_intercept(ln(peso), ln(talla/10.0))),
regr_slope(ln(peso), ln(talla/10.0)),
regr_r2(ln(peso), ln(talla/10.0)),
talla, peso, espcod, fecha
from biologicos
WHERE talla > 0 AND peso > 0;

Y luego los datos están disponibles para que les apliques WHERE según te
plazca:

select exp, regr_slope, regr_r2
from regresion_biologicos
WHERE espcod = '10156' AND fecha between '2009/04/01' and '2009/6/30';

--
Álvaro Herrera <alvherre(at)commandprompt(dot)com>
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Guillermo Villanueva 2010-05-27 15:55:06 Re: Creando funciones
Previous Message Jorge Tornero 2010-05-27 15:19:16 RE: Creando funciones