SQL - Mostrar solo dos registros por cliente

   
Vista:

Mostrar solo dos registros por cliente

Publicado por jose (2 intervenciones) el 16/10/2015 14:16:22
Hola a todos!
A ver si alguno me ilumina... Necesito sacar un listado de clientes con sus dos primeras transacciones..
Ya tengo una consulta que me da todos los clientes con todas sus transacciones, pero necesito que en lugar de todas estas transacciones me saque solamente las dos primeras de cada uno. He probado el rownum pero no sirve, el limit 2 me da error... La consulta que tengo ahora mismo es bastante contundente ya que son 3 select anidados... alguna idea de como hacer que salgan solamente dos por cada cliente?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Mostrar solo dos registros por cliente

Publicado por Rafael (83 intervenciones) el 16/10/2015 14:25:20
Si pones la consulta que haces es mas facil ayudarte.

Y si especificas el motor de la base de datos aun mejor.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Mostrar solo dos registros por cliente

Publicado por jose (2 intervenciones) el 16/10/2015 14:36:33
Cierto... perdón:

es algo así:
1
2
3
4
5
6
7
8
9
10
11
12
select distinct(t123.cod_cliente), min(fecha)
  from operac o123, tarj t123
  where o123.codigocliente2=t123.codigocliente2
  and t123.COD_CLIENTE in
    (select que devuelve lista de clientes)
and t123.fecha_alta between to_date('01/01/2014','dd/mm/yyyy') and  to_date('30/10/2015','dd/mm/yyyy')
and o12.fecha between to_date('01/01/2014','dd/mm/yyyy') and  to_date('01/01/2016','dd/mm/yyyy')
and cod_centro is not null
and t123.cod_cliente not in (lista clientes)
group by t123.cod_cliente, (t123.cod_cliente)
having count (t123.cod_cliente)>=2
order by t123.cod_cliente;

Utilizando sobre Oracle
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Mostrar solo dos registros por cliente

Publicado por Rafael (83 intervenciones) el 19/10/2015 13:35:01
Bueno como tampoco se puede ver mas de lo que hay te doy una idea...

Dada una tabla similar a esta:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
create table datos (
    idcliente int,
    fecha     date
);
 
insert into datos values ( 1, to_date('10/10/2010','dd/mm/yyyy'));
insert into datos values ( 1, to_date('10/10/2011','dd/mm/yyyy'));
insert into datos values ( 1, to_date('10/10/2012','dd/mm/yyyy'));
insert into datos values ( 1, to_date('10/10/2013','dd/mm/yyyy'));
insert into datos values ( 1, to_date('10/10/2014','dd/mm/yyyy'));
insert into datos values ( 1, to_date('10/10/2015','dd/mm/yyyy'));
insert into datos values ( 2, to_date('10/10/2012','dd/mm/yyyy'));
insert into datos values ( 2, to_date('10/10/2013','dd/mm/yyyy'));
insert into datos values ( 2, to_date('10/10/2014','dd/mm/yyyy'));
insert into datos values ( 2, to_date('10/10/2015','dd/mm/yyyy'));
insert into datos values ( 3, to_date('10/10/2010','dd/mm/yyyy'));
insert into datos values ( 3, to_date('10/10/2011','dd/mm/yyyy'));
insert into datos values ( 3, to_date('10/10/2012','dd/mm/yyyy'));
insert into datos values ( 4, to_date('10/10/2010','dd/mm/yyyy'));
insert into datos values ( 5, to_date('10/10/2011','dd/mm/yyyy'));
insert into datos values ( 4, to_date('10/10/2012','dd/mm/yyyy'));
insert into datos values ( 5, to_date('10/10/2013','dd/mm/yyyy'));
insert into datos values ( 6, to_date('10/10/2014','dd/mm/yyyy'));
insert into datos values ( 6, to_date('10/10/2015','dd/mm/yyyy'));


Puedes usar un query tal que asi:
1
2
3
4
5
6
7
8
9
10
select idcliente
     , fecha
from   (select idcliente
             , fecha
             , row_number() over (partition by idcliente order by fecha) as pos
        from   datos) q1
where  pos < 3
order  by idcliente
     , fecha
;

Con lo cual obtienes solo las dos primeras fechas de cada cliente.
Imagen

Espero te sirva... si quisieras las dos ultimas de cada cliente bastaria con modificar
1
2
3
4
5
6
7
8
9
10
select idcliente
     , fecha
from   (select idcliente
             , fecha
             , row_number() over (partition by idcliente order by fecha desc) as pos
        from   datos) q1
where  pos < 3
order  by idcliente
     , fecha desc
;

Con la fecha descendiente tomas las dos ultimas....

Saludos

Pd. Si te sirve un mas uno no me viene mal...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar