From: | Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org> |
---|---|
To: | Christian Compagnon <ccompagnon(at)gmail(dot)com> |
Cc: | pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: Generación de Histogramas |
Date: | 2005-09-09 14:58:21 |
Message-ID: | 20050909145821.GB21739@surnet.cl |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
On Fri, Sep 09, 2005 at 10:26:31AM -0400, Christian Compagnon wrote:
Hola,
> He estado buscando en google como hacer un histograma mediante una
> consulta en postgres, pero no he tenido suerte.
> La idea es hacer una consulta que recorra una tabla con fechas
> (dd-mm-aaaa hh:mm:ss) y vaya contando cada vez que una determinada
> fecha cae en algún intervalo. La consulta debe incorporar un tamaño de
> intervalo, pero la verdad es que no tengo ida como hacerlo, es raro no
> haber encontrado inforación de esto en google, porque es bastante
> útil, sobre todo para caracterizar cargas de trabajo.
>
> Alguien lo ha hecho, es posible? imagino que hay que declarar
> variables en la consulta.
Claro. No puedes hacerlo directamente en SQL, precisamente porque no
puedes declarar variables, pero con PL/pgSQL es posible. La manera en
que yo lo hice hace algun tiempo fue:
1. crear una funcion que corta un intervalo grande en varios trozos.
2. hacer un JOIN de la tabla con fechas y esa funcion, usando BETWEEN
para determinar en cual de los "buckets" del histograma cae cada
registro de la tabla. Agrupas (GROUP BY) apropiadamente y cuentas
(count(*)) las ocurrencias en cada bucket.
La funcion de (1) es algo como:
CREATE OR REPLACE FUNCTION intervalos
(timestamp with time zone,
timestamp with time zone,
interval) RETURNS SETOF RECORD AS $$
DECLARE
inicio ALIAS FOR $1;
valor timestamp with time zone;
final ALIAS FOR $2;
paso ALIAS FOR $3;
ret RECORD;
BEGIN
valor := inicio;
LOOP
IF valor >= final THEN
RETURN;
END IF;
SELECT INTO ret valor, valor+paso;
RETURN NEXT ret;
valor := (valor + paso);
END LOOP;
END;
$$
LANGUAGE plpgsql IMMUTABLE STRICT;
--
Alvaro Herrera -- Valdivia, Chile Architect, www.EnterpriseDB.com
The easiest way to resolve [trivial code guidelines disputes] is to fire
one or both of the people involved. (Damian Conway)
From | Date | Subject | |
---|---|---|---|
Next Message | Edwin Quijada | 2005-09-09 15:11:43 | RE: slony |
Previous Message | Christian Compagnon | 2005-09-09 14:26:31 | Generación de Histogramas |