Select top 10 de cada grupo.

03/01/2005 - 17:32 por Luis Enrique García A. | Informe spam
Hola lista, feliz año a todos.


Tengo una tabla de clientes (150,000 registros) y una de transacciones (n
mil mas k clientes) y necesito realizar una consulta que me regrese las
ultimas 10 transacciones para cada cliente, he probado diferentes formas,
pero aun no doy con una que sea por SQL y no por un stored o un cursor, hay
alguna forma de hacerlo???


Clientes
IdCliente (PK Int)
Discve (PK Int)

Transacciones
Idtransaccion (PK Identity)
IdCliente (FK)
DisCve (FK)

Gracias por su ayuda.


Luis E.

Preguntas similare

Leer las respuestas

#6 Alberto D.
04/01/2005 - 21:30 | Informe spam
Upsss, tienes razon :'(

Creo que debi probar antes...

Gracias por la observacion Maxi

"MAXI" escribió en el mensaje
news:%
Alberto, creo que ese query no responde a la pregunta :(

Fijate que solo estas trayendo los ultimos 10 registros de un cliente,


pero
el amigo pidio los ultimos 10 de cada cliente :(, con lo cual con ese


query
no podras responder a su pregunta. ADemas fijate otra cisa, dentro del
subselect estas trayendo los ultimos 10 registros sin importar el cliente,
con lo que la cosa es aun peor :(

Un abrazo



Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)

"Alberto D." escribió en el mensaje
news:
> No lo tuve chance de hacer la prueba, pero por favor pruebalo y me
> comentas
> los resultados
>
> Select *
> From Clientes
> Inner Join (Select Top 10 * From Transacciones Order by Idtransaccion
> Desc)
> Trans On
> Clientes.IdCliente = Trans.IdCliente And Clientes.DisCve = Trans.DisCve
>
> Saludos!!!
>
> "Luis Enrique García A." escribió en el mensaje
> news:%
>> Hola lista, feliz año a todos.
>>
>>
>> Tengo una tabla de clientes (150,000 registros) y una de transacciones


(n
>> mil mas k clientes) y necesito realizar una consulta que me regrese las
>> ultimas 10 transacciones para cada cliente, he probado diferentes


formas,
>> pero aun no doy con una que sea por SQL y no por un stored o un cursor,
> hay
>> alguna forma de hacerlo???
>>
>>
>> Clientes
>> IdCliente (PK Int)
>> Discve (PK Int)
>>
>> Transacciones
>> Idtransaccion (PK Identity)
>> IdCliente (FK)
>> DisCve (FK)
>>
>> Gracias por su ayuda.
>>
>>
>> Luis E.
>>
>>
>
>


Respuesta Responder a este mensaje
#7 MAXI
05/01/2005 - 00:58 | Informe spam
;-)



Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)

"Alberto D." escribió en el mensaje
news:
Upsss, tienes razon :'(

Creo que debi probar antes...

Gracias por la observacion Maxi

"MAXI" escribió en el mensaje
news:%
Alberto, creo que ese query no responde a la pregunta :(

Fijate que solo estas trayendo los ultimos 10 registros de un cliente,


pero
el amigo pidio los ultimos 10 de cada cliente :(, con lo cual con ese


query
no podras responder a su pregunta. ADemas fijate otra cisa, dentro del
subselect estas trayendo los ultimos 10 registros sin importar el
cliente,
con lo que la cosa es aun peor :(

Un abrazo



Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)

"Alberto D." escribió en el mensaje
news:
> No lo tuve chance de hacer la prueba, pero por favor pruebalo y me
> comentas
> los resultados
>
> Select *
> From Clientes
> Inner Join (Select Top 10 * From Transacciones Order by Idtransaccion
> Desc)
> Trans On
> Clientes.IdCliente = Trans.IdCliente And Clientes.DisCve = Trans.DisCve
>
> Saludos!!!
>
> "Luis Enrique García A." escribió en el mensaje
> news:%
>> Hola lista, feliz año a todos.
>>
>>
>> Tengo una tabla de clientes (150,000 registros) y una de transacciones


(n
>> mil mas k clientes) y necesito realizar una consulta que me regrese
>> las
>> ultimas 10 transacciones para cada cliente, he probado diferentes


formas,
>> pero aun no doy con una que sea por SQL y no por un stored o un
>> cursor,
> hay
>> alguna forma de hacerlo???
>>
>>
>> Clientes
>> IdCliente (PK Int)
>> Discve (PK Int)
>>
>> Transacciones
>> Idtransaccion (PK Identity)
>> IdCliente (FK)
>> DisCve (FK)
>>
>> Gracias por su ayuda.
>>
>>
>> Luis E.
>>
>>
>
>






Respuesta Responder a este mensaje
#8 Luis Enrique García A.
05/01/2005 - 19:41 | Informe spam
Muchas gracias MAXI, ya corri tu SQL, aun no lo acabo de comprender, pero
hace exatamente lo que necesito.

Solo lo estudiare y vere por que si realizas varias veces el insert
(generando "n" transacciones a los clientes) con la instruccion
#trans.id >= t2.id trae las primeras
minetras que

#trans.id <= t2.id trae las ultimas.

Asi que lo estudiare, y vere como lo tengo que implementar.

Muchas Gracias por la ayuda

Luis E.



"MAXI" escribió en el mensaje
news:
Hola, te paso un ejemplo de como sacar los ultimo 2 registros, esto lo
podrias cambiar a 10 con el valor del having

==>
CREATE TABLE #TRANS (ID INT IDENTITY, CLIENTE VARCHAR(10), FECHA DATETIME)

INSERT INTO #TRANS (CLIENTE,FECHA) VALUES ('1',GETDATE())
INSERT INTO #TRANS (CLIENTE,FECHA) VALUES ('1',GETDATE()+1)
INSERT INTO #TRANS (CLIENTE,FECHA) VALUES ('2',GETDATE()+2)
INSERT INTO #TRANS (CLIENTE,FECHA) VALUES ('2',GETDATE()+3)
INSERT INTO #TRANS (CLIENTE,FECHA) VALUES ('2',GETDATE()+4)
INSERT INTO #TRANS (CLIENTE,FECHA) VALUES ('3',GETDATE()+5)
INSERT INTO #TRANS (CLIENTE,FECHA) VALUES ('3',GETDATE()+6)
INSERT INTO #TRANS (CLIENTE,FECHA) VALUES ('3',GETDATE()+7)
INSERT INTO #TRANS (CLIENTE,FECHA) VALUES ('3',GETDATE()+8)


SELECT #trans.id,
#TRANS.CLIENTE,COUNT(*),#trans.fecha FROM #TRANS INNER JOIN #TRANS T2 ON
T2.CLIENTE = #TRANS.CLIENTE
and #trans.id >=t2.id
GROUP BY #TRANS.CLIENTE,#trans.id,#trans.fecha
having count(*) <=2

>
Fijate si esto te es util :-)











Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)

"Luis Enrique García A." escribió en el mensaje
news:
> mmmmm cierto Maxi, ya decia que olvidaba algo.
>
> necesito mostrar las ultimas 10 transacciones de cada cliente, la unica
> forma que tengo de identificarlas es el idTransaccion, que es un


identity.
>
> algo asi como:
>
> select top 10 * from transacciones where discve = 1 and cliente = 1


order
> by idtransaccion desc
>
> Lo unico que he conseguido es el siguiente script, pero el tiempo de
> ejecucion es bastante elevado y no se me hace lo mas optimo :(
>
> La tabla ##contador, solo la estoy utilizando para monitorear los
> registros
> procesados, no estaria en el script definitivo.
>
> para un tiempo de: 8:20 (Tomado del analizador de consultas) tengo el
> siguiente resultado:
>
> Van Total
> 15332 128045
>
> create table #paso (idPaso int identity, SQL Varchar(8000))
>
> insert into #paso(SQL)
> select 'select top 10 * from transacciones where discve = ' +
> cast(discve
> as varchar(10)) + ' and basis = ' + cast(basis as varchar(10)) + '


order
> by
> idtransaccion desc'
> from mclientes
>
> create table ##contador (Van int, Total int)
>
> /*
> select 'select top 10 * from transacciones where discve = ' +
> cast(discve
> as varchar(10)) + ' and basis = ' + cast(basis as varchar(10)) + ' and
> codigomov <> ''EM'' order by idtransaccion desc'
> from mclientes
> */
> declare @ap int,
> @max int,
> @sql varchar(8000)
>
> select @ap = min(idpaso),
> @max = max(idpaso)
> from #paso
>
> insert into ##contador
> select @ap, @max
>
> while (@ap <= @max)
> begin
> set @sql = 'Insert into webTransacciones '
> select @sql = @sql + sql
> from #paso
> where idpaso = @ap
> exec ( @sql )
> update ##contador set van = @ap
> set @ap = @ap + 1
> end
>
>
>
> Gracias.
>
> Luis E.
>
>
> "Maxi" escribió en el mensaje
> news:
>> Hola, y como definis a las ultimas transacciones?
>>
>>
>> Salu2
>> Maxi
>>
>>
>> "Luis Enrique García A." escribió en el mensaje
>> news:%
>> > Hola lista, feliz año a todos.
>> >
>> >
>> > Tengo una tabla de clientes (150,000 registros) y una de


transacciones
> (n
>> > mil mas k clientes) y necesito realizar una consulta que me regrese


las
>> > ultimas 10 transacciones para cada cliente, he probado diferentes
> formas,
>> > pero aun no doy con una que sea por SQL y no por un stored o un


cursor,
>> > hay
>> > alguna forma de hacerlo???
>> >
>> >
>> > Clientes
>> > IdCliente (PK Int)
>> > Discve (PK Int)
>> >
>> > Transacciones
>> > Idtransaccion (PK Identity)
>> > IdCliente (FK)
>> > DisCve (FK)
>> >
>> > Gracias por su ayuda.
>> >
>> >
>> > Luis E.
>> >
>> >
>>
>>
>
>


Respuesta Responder a este mensaje
#9 MAXI
05/01/2005 - 23:07 | Informe spam
Hola, es asi señor!!! espero que puedas aprovecharlo :-)



Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)

"Luis Enrique García A." escribió en el mensaje
news:
Muchas gracias MAXI, ya corri tu SQL, aun no lo acabo de comprender, pero
hace exatamente lo que necesito.

Solo lo estudiare y vere por que si realizas varias veces el insert
(generando "n" transacciones a los clientes) con la instruccion
#trans.id >= t2.id trae las primeras
minetras que

#trans.id <= t2.id trae las ultimas.

Asi que lo estudiare, y vere como lo tengo que implementar.

Muchas Gracias por la ayuda

Luis E.



"MAXI" escribió en el mensaje
news:
Hola, te paso un ejemplo de como sacar los ultimo 2 registros, esto lo
podrias cambiar a 10 con el valor del having

==>>
CREATE TABLE #TRANS (ID INT IDENTITY, CLIENTE VARCHAR(10), FECHA
DATETIME)

INSERT INTO #TRANS (CLIENTE,FECHA) VALUES ('1',GETDATE())
INSERT INTO #TRANS (CLIENTE,FECHA) VALUES ('1',GETDATE()+1)
INSERT INTO #TRANS (CLIENTE,FECHA) VALUES ('2',GETDATE()+2)
INSERT INTO #TRANS (CLIENTE,FECHA) VALUES ('2',GETDATE()+3)
INSERT INTO #TRANS (CLIENTE,FECHA) VALUES ('2',GETDATE()+4)
INSERT INTO #TRANS (CLIENTE,FECHA) VALUES ('3',GETDATE()+5)
INSERT INTO #TRANS (CLIENTE,FECHA) VALUES ('3',GETDATE()+6)
INSERT INTO #TRANS (CLIENTE,FECHA) VALUES ('3',GETDATE()+7)
INSERT INTO #TRANS (CLIENTE,FECHA) VALUES ('3',GETDATE()+8)


SELECT #trans.id,
#TRANS.CLIENTE,COUNT(*),#trans.fecha FROM #TRANS INNER JOIN #TRANS T2 ON
T2.CLIENTE = #TRANS.CLIENTE
and #trans.id >=t2.id
GROUP BY #TRANS.CLIENTE,#trans.id,#trans.fecha
having count(*) <=2

>>
Fijate si esto te es util :-)











Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)

"Luis Enrique García A." escribió en el mensaje
news:
> mmmmm cierto Maxi, ya decia que olvidaba algo.
>
> necesito mostrar las ultimas 10 transacciones de cada cliente, la unica
> forma que tengo de identificarlas es el idTransaccion, que es un


identity.
>
> algo asi como:
>
> select top 10 * from transacciones where discve = 1 and cliente = 1


order
> by idtransaccion desc
>
> Lo unico que he conseguido es el siguiente script, pero el tiempo de
> ejecucion es bastante elevado y no se me hace lo mas optimo :(
>
> La tabla ##contador, solo la estoy utilizando para monitorear los
> registros
> procesados, no estaria en el script definitivo.
>
> para un tiempo de: 8:20 (Tomado del analizador de consultas) tengo el
> siguiente resultado:
>
> Van Total
> 15332 128045
>
> create table #paso (idPaso int identity, SQL Varchar(8000))
>
> insert into #paso(SQL)
> select 'select top 10 * from transacciones where discve = ' +
> cast(discve
> as varchar(10)) + ' and basis = ' + cast(basis as varchar(10)) + '


order
> by
> idtransaccion desc'
> from mclientes
>
> create table ##contador (Van int, Total int)
>
> /*
> select 'select top 10 * from transacciones where discve = ' +
> cast(discve
> as varchar(10)) + ' and basis = ' + cast(basis as varchar(10)) + ' and
> codigomov <> ''EM'' order by idtransaccion desc'
> from mclientes
> */
> declare @ap int,
> @max int,
> @sql varchar(8000)
>
> select @ap = min(idpaso),
> @max = max(idpaso)
> from #paso
>
> insert into ##contador
> select @ap, @max
>
> while (@ap <= @max)
> begin
> set @sql = 'Insert into webTransacciones '
> select @sql = @sql + sql
> from #paso
> where idpaso = @ap
> exec ( @sql )
> update ##contador set van = @ap
> set @ap = @ap + 1
> end
>
>
>
> Gracias.
>
> Luis E.
>
>
> "Maxi" escribió en el mensaje
> news:
>> Hola, y como definis a las ultimas transacciones?
>>
>>
>> Salu2
>> Maxi
>>
>>
>> "Luis Enrique García A." escribió en el
>> mensaje
>> news:%
>> > Hola lista, feliz año a todos.
>> >
>> >
>> > Tengo una tabla de clientes (150,000 registros) y una de


transacciones
> (n
>> > mil mas k clientes) y necesito realizar una consulta que me regrese


las
>> > ultimas 10 transacciones para cada cliente, he probado diferentes
> formas,
>> > pero aun no doy con una que sea por SQL y no por un stored o un


cursor,
>> > hay
>> > alguna forma de hacerlo???
>> >
>> >
>> > Clientes
>> > IdCliente (PK Int)
>> > Discve (PK Int)
>> >
>> > Transacciones
>> > Idtransaccion (PK Identity)
>> > IdCliente (FK)
>> > DisCve (FK)
>> >
>> > Gracias por su ayuda.
>> >
>> >
>> > Luis E.
>> >
>> >
>>
>>
>
>






email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida