Creando funciones

From: "Jorge Tornero" <jorge(dot)tornero(at)cd(dot)ieo(dot)es>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Creando funciones
Date: 2010-05-27 09:01:58
Message-ID: 1274950918.2901.12.camel@pcieoinf.cd.ieo.es
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola a todos,

En primer lugar, quisiera presentarme, mi nombre en Jorge Tornero y
trabajo en un centro de investigación pesquera y pretendo hacer uso de
Postgresql para mi trabajo, lo que ocurre es que (como siempre) uno se
encuentra con algunos escollos que intenta salvar, hasta que se le hace
inevitable preguntar...

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)

Ahora bien, lo que quiero es crear una función, por ejemplo:

regresion(parametro1,parametro2)

que me ahorre el

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))

cada vez que hago una consulta y de esta manera las consultas de este
tipo fueran:

select regresion(talla,peso) from biologicos where.......;

para ello, tirando de manuales, he hecho algo así:

DROP FUNCTION IF EXISTS regresion(int,numeric);
CREATE FUNCTION regresion(int,numeric) RETURNS TABLE(A double, B double,
R2 double)
AS $$select
exp(regr_intercept(ln($2),ln($1/10.0))),regr_slope(ln($2),ln($1/10.0)),regr_r2(ln($2),ln($1/10.0))$$
LANGUAGE SQL;

Que naturalmente me dice 'tararí que te vi'.

Alguien tiene alguna sugerencia de cómo proceder? Sería bastante trivial
hacer algo en python por ejemplo, pero la cosa es que la función quede
en el servidor.

Un saludo y gracias

--
-----------------------------------------
Jorge Tornero Núñez
Centro Oceanográfico de Cádiz
Instituto Español de Oceanografía
Puerto Pesquero - Muelle de Levante, s/n
11006 Cádiz - España
Tel. +34 956294189
Fax. +34 956294232
www.ieo.es

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Guillermo Villanueva 2010-05-27 12:05:18 Re: Creando funciones
Previous Message Emanuel Calvo Franco 2010-05-27 05:03:10 Re: castear variable tipo RECORD a TEXT[]