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

Re: Creando funciones

From: alvherre <alvherre(at)commandprompt(dot)com>
To: Jorge Tornero <jorge(dot)tornero(at)cd(dot)ieo(dot)es>
Cc: pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Creando funciones
Date: 2010-05-27 15:44:26
Message-ID: 1274974606-sup-7998@alvh.no-ip.org (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
Excerpts from Jorge Tornero's message of jue may 27 05:01:58 -0400 2010:

Hola, bienvenido.

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

Hmm, lo que buscas es una función que tome todo el conjunto de entrada y
retorne en la salida un único registro con tres columnas, ¿verdad?  Me
parece que eso no es posible.  Lo primero que se me viene a la mente es
una función de agregación, pero éstas tienen solamente una columna de
salida, no tres.  Ahora bien, quizás podrías arreglártelas para
construir una función de agregación que retorne un "record" en la
salida, pero la verdad es que no sé si eso será posible sin tener que
trabajar en C (cosa que no te recomiendo mucho).

Creo que lo más simple sería que crearas una vista; algo así:

create view regresion_biologicos as
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)),
       talla, peso, espcod, fecha
  from biologicos
 WHERE talla > 0 AND peso > 0;

Y luego los datos están disponibles para que les apliques WHERE según te
plazca:

select exp, regr_slope, regr_r2
  from regresion_biologicos
 WHERE espcod = '10156' AND fecha between '2009/04/01' and '2009/6/30';


-- 
Álvaro Herrera <alvherre(at)commandprompt(dot)com>
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

In response to

pgsql-es-ayuda by date

Next:From: Guillermo VillanuevaDate: 2010-05-27 15:55:06
Subject: Re: Creando funciones
Previous:From: Jorge TorneroDate: 2010-05-27 15:19:16
Subject: RE: Creando funciones

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