Re: [pgsql-es-ayuda] Generación de Histogramas

From: "Siciliano, Pablo E(dot)" <psiciliano(at)puentenet(dot)com>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: [pgsql-es-ayuda] Generación de Histogramas
Date: 2005-09-09 15:53:01
Message-ID: 001a01c5b556$8ed90790$2300a8c0@PuenteHnos.local
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola a ambos.

No se si entendí bien el pedido pero, ¿No se puede hacer directamente con
algo así?

SELECT count(1) AS cant, CASE WHEN fecha between 'fecha1_1' AND 'fecha1_2'
THEN '1' WHEN fecha between 'fecha2_1' AND 'fecha2_2' THEN '2' WHEN fecha
between 'fecha3_1' AND 'fecha3_2' THEN '3' ELSE '4' END AS intervalo GROUP
BY intervalo ORDER BY intervalo

Obviamente, en el case pondrías todos los intervalos uno a continuación del
otro.

Saludos!
Pablo E. Siciliano.

----- Original Message -----
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>
Sent: Friday, September 09, 2005 11:58 AM
Subject: Re: [pgsql-es-ayuda] Generación de Histogramas

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)

---------------------------(fin del mensaje)---------------------------
TIP 1: para suscribirte y desuscribirte, visita
http://archives.postgresql.org/pgsql-es-ayuda

--
No virus found in this incoming message.
Checked by AVG Anti-Virus.
Version: 7.0.344 / Virus Database: 267.10.19/93 - Release Date: 2005/09/08

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jose Arce 2005-09-09 18:00:12 conexion remota a postgres
Previous Message Edwin Quijada 2005-09-09 15:11:43 RE: slony