Jorge, creo que la complicación que tenes es porque tu función es de tipo TABLE, entonces la forma de llamarla es a través de un select Por favor, probá lo que yo te decía antes: select (select A, B, R2 from regresion(b.talla,b.peso)) from biologicos b
Saludos ~~~~~~~~~~~~~~~~ Guillermo Villanueva El 27 de mayo de 2010 12:19, Jorge Tornero <jorge.torn...@cd.ieo.es>escribió: > Hola a todos, > > Bueno, gracias, lo primero, por las respuestas que van llegando. En cuanto > a lo que menciona Miguel, eso es cierto (de hecho la función funciona con > float) y se debe a un fallo porque pegué mal la función, vamos que pegué una > de prueba que se diferenciaba en lo de double y está subsanado,con lo que la > función devuelve un valor si se la llama de la manera que describe Miguel es > decir, en plan select regreson (1,2). Pero esto no tiene sentido, ya que las > regresiones se calculan sobre un conjunto de datos. Mi problema es que si > hacemos, por ejempo: > > CREATE TABLE prueba (talla int, peso numeric(5,2), fecha date); > > metemos varios datos en su interior y hacemos > > SELECT regresion(talla,peso) from prueba; > > lo que ocurre es que me hace la función regresión sobre cada una de las > tuplas de la consulta. Es decir, no se comporta como un agregado (por > ejemplo, tal y como se comporta la funcion max() o min() o sin ir más lejos > cualquiera de las que he empleado yo en la función). > > Con lo cual no me sirve para nada. La verdad, estoy un poco anonadado > porque me parece una cosa un poco trivial, en el sentido de que es casi com > si fuera una "macro", más que una función. > > Me han sugerido crear un agregado con CREATE AGGREGATE, pero claro, el > problema es que sólo retorna un valor, entre otros problemillas. > > Bueno, seguimos en el "ajo". Un saludo y gracias > > > Jorge Tornero > > Centro Oceanográfico de Cádiz > Instituto Español de Oceanografía > Muelle de Levante, s/n > Puerto Pesquero - Cadiz > > > > -----Mensaje original----- > De: pgsql-es-ayuda-ow...@postgresql.org en nombre de Miguel Rodríguez > Penabad > Enviado el: jue 27/05/2010 16:08 > Para: foro postgresql > Asunto: Re: [pgsql-es-ayuda] Creando funciones > > > Nada, olvida mi correo anterior. Conté mal los paréntesis y pensé que > debería devolver un único valor. > > El problema que vi tratando de reproducir tu "create function" > es que el tipo de datos "double" no existe, es "double precision". > > Así, probando: > > => drop function regresion(int,numeric); > DROP FUNCTION > penabad=> CREATE FUNCTION regresion(int,numeric) RETURNS TABLE(A > double precision, B double precision, > R2 double precision) > 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; > CREATE FUNCTION > > => select regresion(1,2); > regresion > ----------------------------------------- > (1.09770357551321,-0.260946327683616,1) > (1 row) > > Como no tengo idea de lo que devuelven esas funciones de regresión, no > sé si es lo que quieres, pero al menos devuelve algo ;) > > Saludos > > -- > Miguel Rodríguez Penabad > - > Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org > ) > Para cambiar tu suscripción: > http://www.postgresql.org/mailpref/pgsql-es-ayuda > > >