Re: Sentencia SQL para dos registros por grupo

Lists: pgsql-es-ayuda
From: Mario Wojcik <mariowojcik(at)yahoo(dot)com(dot)ar>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Sentencia SQL para dos registros por grupo
Date: 2007-03-30 20:50:24
Message-ID: 460D7810.603@yahoo.com.ar
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Hola Muchachos...
Es posible hacer esto con una sola sentencia SQL bien hecha?
Por ejemplo, si en la base tengo esto...
# CLIENTE FECHA LLAMADA
1 1 01/01 aaaaaaa
2 1 02/01 bbbbbbb
3 1 03/01 ccccccc
4 1 04/01 ddddddd
5 2 02/01 bbbbbbb
6 3 02/01 fffffff
7 3 06/01 jjjjjjj
8 3 08/01 eeeeeee
9 3 09/01 wwwwwww
10 3 09/01 xxxxxxx

Yo quiero que la consulta me devuelva las 2 primeras de cada uno, es decir:
CLIENTE FECHA LLAMADA
1 1 01/01 aaaaaaa
2 1 02/01 bbbbbbb
5 2 02/01 bbbbbbb
6 3 02/01 fffffff
7 3 06/01 jjjjjjj

Se podrá?


From: Juan Martínez <jeugenio(at)umcervantes(dot)cl>
To: Mario Wojcik <mariowojcik(at)yahoo(dot)com(dot)ar>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Sentencia SQL para dos registros por grupo
Date: 2007-03-31 08:46:45
Message-ID: 460E1FF5.2030000@umcervantes.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Mario Wojcik escribió:
> Hola Muchachos...
> Es posible hacer esto con una sola sentencia SQL bien hecha?
> Por ejemplo, si en la base tengo esto...
> # CLIENTE FECHA LLAMADA
> 1 1 01/01 aaaaaaa
> 2 1 02/01 bbbbbbb
> 3 1 03/01 ccccccc
> 4 1 04/01 ddddddd
> 5 2 02/01 bbbbbbb
> 6 3 02/01 fffffff
> 7 3 06/01 jjjjjjj
> 8 3 08/01 eeeeeee
> 9 3 09/01 wwwwwww
> 10 3 09/01 xxxxxxx
>
>
> Yo quiero que la consulta me devuelva las 2 primeras de cada uno, es decir:
> CLIENTE FECHA LLAMADA
> 1 1 01/01 aaaaaaa
> 2 1 02/01 bbbbbbb
> 5 2 02/01 bbbbbbb
> 6 3 02/01 fffffff
> 7 3 06/01 jjjjjjj
>
> Se podrá?

A ver:

SELECT nro,cliente,fecha,llamada
FROM tabla
GROUP BY cliente HAVING count(cliente) <= 2
ORDER BY cliente,llamada;

No lo probe, pero tengo la sospecha que deberia funcionar para lo que
necesitas.

--
Juan Martinez G. Mac Iver # 370
Departamento de Informatica 4997900 - 4997950
Universidad Miguel de Cervantes Santiago - Chile
http://download.bblug.usla.org.ar/netiquette.png


From: Mario Wojcik <mariowojcik(at)yahoo(dot)com(dot)ar>
To: Juan Martínez <jeugenio(at)umcervantes(dot)cl>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Sentencia SQL para dos registros por grupo
Date: 2007-03-31 20:02:20
Message-ID: 460EBE4C.6000604@yahoo.com.ar
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Juan Martínez escribió:
> Mario Wojcik escribió:
>> Hola Muchachos...
>> Es posible hacer esto con una sola sentencia SQL bien hecha?
>> Por ejemplo, si en la base tengo esto...
>> # CLIENTE FECHA LLAMADA
>> 1 1 01/01 aaaaaaa
>> 2 1 02/01 bbbbbbb
>> 3 1 03/01 ccccccc
>> 4 1 04/01 ddddddd
>> 5 2 02/01 bbbbbbb
>> 6 3 02/01 fffffff
>> 7 3 06/01 jjjjjjj
>> 8 3 08/01 eeeeeee
>> 9 3 09/01 wwwwwww
>> 10 3 09/01 xxxxxxx
>>
>>
>> Yo quiero que la consulta me devuelva las 2 primeras de cada uno, es
>> decir:
>> CLIENTE FECHA LLAMADA
>> 1 1 01/01 aaaaaaa
>> 2 1 02/01 bbbbbbb
>> 5 2 02/01 bbbbbbb
>> 6 3 02/01 fffffff
>> 7 3 06/01 jjjjjjj
>>
>> Se podrá?
>
> A ver:
>
> SELECT nro,cliente,fecha,llamada
> FROM tabla
> GROUP BY cliente HAVING count(cliente) <= 2
> ORDER BY cliente,llamada;
>
> No lo probe, pero tengo la sospecha que deberia funcionar para lo que
> necesitas.
>
No funciona, con algunos arreglos logro que me devuelva solo los que
count es 1 o 2 por la condicion HAVING count devuelve el total .

Lo que necesito es que devuelva los primeros uno o dos (si existen)
registros de cada cliente y excluya los demas de cada uno.


From: Javier Estévez CIFA Córdoba <javier(dot)estevez(dot)ext(at)juntadeandalucia(dot)es>
To: "Mario Wojcik" <mariowojcik(at)yahoo(dot)com(dot)ar>, <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Sentencia SQL para dos registros por grupo
Date: 2007-04-02 07:13:34
Message-ID: 008a01c774f6$6d01cd80$6d64460a@cfco04.cap.juntaandalucia.es
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Yo creo que sí. Tendrás que hacer un SELECT cuando el count(*)=2 y agrupar
por CLIENTE...

----- Original Message -----
From: "Mario Wojcik" <mariowojcik(at)yahoo(dot)com(dot)ar>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Sent: Friday, March 30, 2007 10:50 PM
Subject: [pgsql-es-ayuda] Sentencia SQL para dos registros por grupo

Hola Muchachos...
Es posible hacer esto con una sola sentencia SQL bien hecha?
Por ejemplo, si en la base tengo esto...
# CLIENTE FECHA LLAMADA
1 1 01/01 aaaaaaa
2 1 02/01 bbbbbbb
3 1 03/01 ccccccc
4 1 04/01 ddddddd
5 2 02/01 bbbbbbb
6 3 02/01 fffffff
7 3 06/01 jjjjjjj
8 3 08/01 eeeeeee
9 3 09/01 wwwwwww
10 3 09/01 xxxxxxx

Yo quiero que la consulta me devuelva las 2 primeras de cada uno, es decir:
CLIENTE FECHA LLAMADA
1 1 01/01 aaaaaaa
2 1 02/01 bbbbbbb
5 2 02/01 bbbbbbb
6 3 02/01 fffffff
7 3 06/01 jjjjjjj

Se podrá?

---------------------------(fin del mensaje)---------------------------
TIP 9: el optimizador ignorará el uso de recorridos de índice si los
tipos de datos de las columnas no coinciden


From: Oswaldo Hernández <listas(at)soft-com(dot)es>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Sentencia SQL para dos registros por grupo
Date: 2007-04-02 11:56:51
Message-ID: 4610EF83.5020208@soft-com.es
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Mario Wojcik escribió:
> Juan Martínez escribió:
>> Mario Wojcik escribió:
>>> Hola Muchachos...
>>> Es posible hacer esto con una sola sentencia SQL bien hecha?
>>> Por ejemplo, si en la base tengo esto...
>>> # CLIENTE FECHA LLAMADA
>>> 1 1 01/01 aaaaaaa
>>> 2 1 02/01 bbbbbbb
>>> 3 1 03/01 ccccccc
>>> 4 1 04/01 ddddddd
>>> 5 2 02/01 bbbbbbb
>>> 6 3 02/01 fffffff
>>> 7 3 06/01 jjjjjjj
>>> 8 3 08/01 eeeeeee
>>> 9 3 09/01 wwwwwww
>>> 10 3 09/01 xxxxxxx
>>>
>>>
>>> Yo quiero que la consulta me devuelva las 2 primeras de cada uno, es
>>> decir:
>>> CLIENTE FECHA LLAMADA
>>> 1 1 01/01 aaaaaaa
>>> 2 1 02/01 bbbbbbb
>>> 5 2 02/01 bbbbbbb
>>> 6 3 02/01 fffffff
>>> 7 3 06/01 jjjjjjj
>>>
>>> Se podrá?
>>
>> A ver:
>>
>> SELECT nro,cliente,fecha,llamada
>> FROM tabla
>> GROUP BY cliente HAVING count(cliente) <= 2
>> ORDER BY cliente,llamada;
>>
>> No lo probe, pero tengo la sospecha que deberia funcionar para lo que
>> necesitas.
>>
> No funciona, con algunos arreglos logro que me devuelva solo los que
> count es 1 o 2 por la condicion HAVING count devuelve el total .
>
>
> Lo que necesito es que devuelva los primeros uno o dos (si existen)
> registros de cada cliente y excluya los demas de cada uno.
>

Si se puede hacer en una sentencia, suponiendo que la columna '#' sea real y no un nº de fila
devuelto por pgadmin u otro, y ademas este bien ordenada.

Prueba esto:

select
t1.num, t1.cliente, t1.fecha, t1.llamada
from tabla as t1
where (select count(*) from tabla as t2 where t2.cliente = t1.cliente and t2.num <= t1.num) < 3

Saludos,

--
*****************************************
Oswaldo Hernández
oswaldo (@) soft-com (.) es
*****************************************