Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

[SOLUCIONADO] retornar ultimo entrada por cada usuario a un sistema

Estas en el tema de retornar ultimo entrada por cada usuario a un sistema en el foro de SQL Server en Foros del Web. Estimados. Necesito hacer un reporte, en el cual aparesca el ultimo ingreso al sistema de cada usuario Actualmente lo estoy haciendo con un cursor, pero ...
  #1 (permalink)  
Antiguo 08/02/2013, 09:16
 
Fecha de Ingreso: agosto-2006
Mensajes: 10
Antigüedad: 17 años, 7 meses
Puntos: 0
Busqueda retornar ultimo entrada por cada usuario a un sistema

Estimados.

Necesito hacer un reporte, en el cual aparesca el ultimo ingreso al sistema de cada usuario

Actualmente lo estoy haciendo con un cursor, pero el servidor no tiene muchos recursos y en lo personal prefiero no utilizar cursores.

aqui les dejo mi cursor para que se hagan una idea.

Código SQL:
Ver original
  1. DECLARE  @TMPLISTADO TABLE (
  2.          id_usuario INT
  3.          ,id_logUsuario INT
  4.          ,fechaHora datetime
  5.        
  6.     )
  7.     DECLARE @id_usuario INT
  8.     --DECLARE @id_dispositivo VARCHAR(20)
  9.     DECLARE cursor_UV CURSOR FOR  
  10.  
  11.    
  12.     SELECT id_usuario FROM tbl_usuario WHERE id_estado =1
  13.    
  14.        
  15.     OPEN cursor_UV  
  16.     FETCH NEXT FROM cursor_UV INTO  @id_usuario
  17.  
  18.     WHILE @@FETCH_STATUS = 0  
  19.     BEGIN  
  20.         INSERT INTO @TMPLISTADO
  21.         SELECT TOP 1 id_usuario, id_logUsuario, fechaHora
  22.         FROM tbl_logUsuario
  23.         WHERE id_usuario = @id_usuario
  24.         ORDER BY fechaHora DESC
  25.        
  26.         FETCH NEXT FROM cursor_UV INTO  @id_usuario
  27.     END  
  28.  
  29.     CLOSE cursor_UV  
  30.     DEALLOCATE cursor_UV
  31.    
  32.     SELECT * FROM @TMPLISTADO

la tabla log usuario tiene el (id_LogUsuario, el id_del usuario, la fecha) donde registra cada vez que el usuario se ha conectado desde el inicio del sistema.
  #2 (permalink)  
Antiguo 08/02/2013, 09:26
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 7 meses
Puntos: 774
Respuesta: retornar ultimo entrada por cada usuario a un sistema

y para que un cursor?

porque no pruebas con esto:


Código SQL:
Ver original
  1. CREATE TABLE #temp(
  2. usuario VARCHAR(20),
  3. fecha datetime
  4. )
  5.  
  6.  
  7.  
  8. INSERT INTO #temp VALUES ('yo',GETDATE())
  9. INSERT INTO #temp VALUES ('yo',dateadd(mi,1,GETDATE()))
  10. INSERT INTO #temp VALUES ('yo',dateadd(mi,2,GETDATE()))
  11. INSERT INTO #temp VALUES ('yo',dateadd(mi,3,GETDATE()))
  12. INSERT INTO #temp VALUES ('yo',dateadd(mi,4,GETDATE()))
  13. INSERT INTO #temp VALUES ('yo',dateadd(mi,5,GETDATE()))
  14.  
  15. INSERT INTO #temp VALUES ('yo1',GETDATE())
  16. INSERT INTO #temp VALUES ('yo1',dateadd(mi,1,GETDATE()))
  17. INSERT INTO #temp VALUES ('yo1',dateadd(mi,2,GETDATE()))
  18. INSERT INTO #temp VALUES ('yo1',dateadd(mi,3,GETDATE()))
  19. INSERT INTO #temp VALUES ('yo1',dateadd(mi,4,GETDATE()))
  20. INSERT INTO #temp VALUES ('yo1',dateadd(mi,5,GETDATE()))
  21.  
  22. INSERT INTO #temp VALUES ('yo2',GETDATE())
  23. INSERT INTO #temp VALUES ('yo2',dateadd(mi,1,GETDATE()))
  24. INSERT INTO #temp VALUES ('yo2',dateadd(mi,2,GETDATE()))
  25. INSERT INTO #temp VALUES ('yo2',dateadd(mi,3,GETDATE()))
  26. INSERT INTO #temp VALUES ('yo2',dateadd(mi,4,GETDATE()))
  27. INSERT INTO #temp VALUES ('yo2',dateadd(mi,5,GETDATE()))
  28.  
  29.  
  30. SELECT usuario,fecha FROM #temp WHERE fecha IN (SELECT MAX(fecha) FROM #temp GROUP BY usuario)

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 08/02/2013, 10:31
 
Fecha de Ingreso: agosto-2006
Mensajes: 10
Antigüedad: 17 años, 7 meses
Puntos: 0
Respuesta: retornar ultimo entrada por cada usuario a un sistema

algo asi era justo lo que buscaba
muchas gracias Libras.

me di muchas vueltas y no se me ocurrio como hacerlo por eso lo habia echo con un cursor.
y tu lo hiciste en una linea, simplemente genial :)
  #4 (permalink)  
Antiguo 11/02/2013, 14:05
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 8 meses
Puntos: 180
Respuesta: retornar ultimo entrada por cada usuario a un sistema

No me gusta el uso del IN, pero bueno, se te perdona...
__________________
MCTS Isaias Islas
  #5 (permalink)  
Antiguo 13/02/2013, 20:26
 
Fecha de Ingreso: agosto-2006
Mensajes: 10
Antigüedad: 17 años, 7 meses
Puntos: 0
Respuesta: retornar ultimo entrada por cada usuario a un sistema

Cita:
Iniciado por iislas Ver Mensaje
No me gusta el uso del IN, pero bueno, se te perdona...
y como podemos mejorar la consulta sin un in

Podrias darme un ejemplo, necesito optimizar la consulta todo lo que pueda
  #6 (permalink)  
Antiguo 14/02/2013, 09:03
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 7 meses
Puntos: 774
Respuesta: retornar ultimo entrada por cada usuario a un sistema

usa exists en lugar de in
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 14/02/2013, 12:09
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 8 meses
Puntos: 180
Respuesta: retornar ultimo entrada por cada usuario a un sistema

¿Sera asi?

Código SQL:
Ver original
  1. SELECT usuario,fecha FROM #temp t1 WHERE EXISTS
  2. (SELECT MAX(fecha) FROM #temp WHERE MAX(fecha) = t1.fecha GROUP BY usuario)
__________________
MCTS Isaias Islas

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:41.