RE: Creando funciones

From: "Jorge Tornero" <jorge(dot)tornero(at)cd(dot)ieo(dot)es>
To: Miguel Rodríguez Penabad <penabad(at)gmail(dot)com>, <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: Creando funciones
Date: 2010-05-27 15:19:16
Message-ID: 7BDD1998D03D9A4B9DAD0038863D30AF02B8CA@ieocadizb.cd.ieo.es
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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-owner(at)postgresql(dot)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(at)postgresql(dot)org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message alvherre 2010-05-27 15:44:26 Re: Creando funciones
Previous Message Miguel Rodríguez Penabad 2010-05-27 14:08:55 Re: Creando funciones