Re: contar distintos con ventana?

From: "Guillermo E(dot) Villanueva" <guillermovil(at)gmail(dot)com>
To: Alvaro Herrera <alvherre(at)2ndquadrant(dot)com>
Cc: pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: contar distintos con ventana?
Date: 2014-09-05 14:32:06
Message-ID: CANm+PCCDjyuoA59x0pE=mOZDCBH1AU6brVHSOL5bm4GgYZWLXA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

MAESTRO!

Guillermo Villanueva

El 3 de septiembre de 2014, 19:46, Alvaro Herrera <alvherre(at)2ndquadrant(dot)com>
escribió:

> Guillermo E. Villanueva escribió:
> > Hola amigos, con una tabla mas o menos como:
> > id t
> > ---+---
> > 1 0.3
> > 1 0.5
> > 2 1.1
> > 2 1.2
> > 2 1.1
> > 3 0.5
> > 3 0.6
> > Existe alguna forma de función de ventana que me permita obtener la
> > cantidad de ids diferentes listadas? En este caso e (tres)
> > id t cant
> > ---+---+----
> > 1 0.3 3
> > 1 0.5 3
> > 2 1.1 3
> > 2 1.2 3
> > 2 1.1 3
> > 3 0.5 3
> > 3 0.6 3
>
> ¡Es muy simple! Simplemente forma un array con los id que son
> "distinct", luego cuentas el largo de este array sobre la ventana del
> resultado completo:
>
> =# SELECT id, t, array_length(array_agg(DISTINCT id) OVER (), 1) from gv;
>
> ERROR: DISTINCT no está implementado para funciones de ventana deslizante
>
> Oh :-(
>
> Para corregir esto puedes crear una función de agregación propia, que
> agregue elementos sólo cuando son únicos:
>
> create or replace function array_agg_unique(anyarray, anyelement) returns
> anyarray
> language sql
> as $$ select array_agg(distinct a)
> from unnest(coalesce($1, '{}') || $2) a;
> $$;
> create aggregate array_agg_uniq(anyelement) (
> sfunc = array_agg_unique,
> stype = anyarray,
> initcond = '{}'
> );
>
> Este sí funciona:
>
> =# select id, t, array_length(array_agg_uniq(id) over (), 1) from gv;
> id | t | array_length
> ----+-----+--------------
> 1 | 0.3 | 3
> 1 | 0.5 | 3
> 2 | 1.1 | 3
> 2 | 1.2 | 3
> 2 | 1.1 | 3
> 3 | 0.5 | 3
> 3 | 0.6 | 3
> (7 filas)
>
> Ignoro cómo será el rendimiento.
>
> --
> Álvaro Herrera http://www.2ndQuadrant.com/
> PostgreSQL Development, 24x7 Support, Training & Services
>

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jonathan Finlay 2014-09-05 23:36:19 Como concatenar bases de datos de mismo esquema distinta data
Previous Message Juan 2014-09-04 00:56:36 Re: Error de constraint