Hola Jorge, la función se crea correctamente? En ese caso, probaste de hacer simplemente un: select (select * from regresion(b.talla,b.peso)) from biologicos b
Sospecho que debe ser así porque tu función refresion es de tipo TABLE ~~~~~~~~~~~~~~~~ Guillermo Villanueva El 27 de mayo de 2010 06:01, Jorge Tornero <jorge.torn...@cd.ieo.es>escribió: > 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 >