Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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

pgsql-es-ayuda by date

Next:From: alvherreDate: 2010-05-27 15:44:26
Subject: Re: Creando funciones
Previous:From: Miguel Rodríguez PenabadDate: 2010-05-27 14:08:55
Subject: Re: Creando funciones

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group