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

#1 Maxi
03/01/2005 - 18:27 | Informe spam
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
#2 Luis Enrique García A.
03/01/2005 - 18:49 | Informe spam
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
#3 MAXI
04/01/2005 - 01:06 | Informe spam
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
#4 Alberto D.
04/01/2005 - 01:54 | Informe spam
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
#5 MAXI
04/01/2005 - 02:10 | Informe spam
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
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida