none
Mostrar ultimo registro de todos los usuarios RRS feed

  • Pregunta

  • Hola  

    A ver si alguien me puede echar una mano que estoy atascado

    Tengo una base de datos de fichaje

    Tengo dos tablas, una de usuarios y otra de registros con una llave en común que es id_usuario

    la de usuarios tiene las siguientes tablas

    id_usuario, nombre, apellidos

    y la de registros lo siguiente

    id_usuario, fecha_hora, tipo

    en la tabla de registro se guarda todos los registros tanto de entrada como de salida de los usuarios, lo que quiero es que me muestre el último registro de cada usuario, es decir, que me muestre el ultimo registro de entrada o salida de cada usuario

    Yo he consultado lo siguiente pero me muestra todos los registros de todos los usuarios

    select usuarios.id_usuario, usuarios.nombre, registros.fecha_hora from usuarios, registros where usuarios.id_usuario = registros.id_usuario

    Muchas gracias

    Un cordial saludo

    viernes, 3 de julio de 2020 10:39

Respuestas

  • Un truco sencillo que puedes usar es condicionarlo por la máxima fecha usando una subconsulta correlacionada:

    select usuarios.id_usuario, usuarios.nombre, registros.fecha_hora
    from usuarios join registros on usuarios.id_usuario = registros.id_usuario
    where registros.fecha_hora = (select max(fecha_hora) from registros r where r.id_usuario = usuarios.id_usuario)

    Si tienes un SQL Server moderno que soporte la cláusula over, estoy seguro de que con un poco de esfuerzo se puede escribir una sentencia más eficiente que la anterior usando este mecanismo, pero la que yo te he puesto funciona en todas las versiones antiguas y es fácil de entender.

    Nota: Te he cambiado la antiquísima sintaxis de SQL-86 que estabas usando para unir las tablas por la SQL-92. Aunque la antigua sigue siendo compatible, es menos clara porque no distingue en el where cuáles son las condiciones de unión y cuáles son las condiciones de filtrado. 


    viernes, 3 de julio de 2020 11:22
  • Hola nene31787:

    Puedes aplicar una pequeña variante sobre la query que te ha proporcionado Alberto.

    select usuarios.id_usuario, usuarios.nombre, fn.fecha_hora
    from usuarios 
    outer apply (
    	Select max (fecha_hora) as fecha_hora
    	from registros r2
    	where r2.id_usuario = usuarios.id_usuario 
    	) fn

    Al aplicar el operador outer apply obtienes también los resultados cuya fecha es Null

    • Marcado como respuesta nene31787 martes, 7 de julio de 2020 9:50
    lunes, 6 de julio de 2020 9:51

Todas las respuestas

  • Un truco sencillo que puedes usar es condicionarlo por la máxima fecha usando una subconsulta correlacionada:

    select usuarios.id_usuario, usuarios.nombre, registros.fecha_hora
    from usuarios join registros on usuarios.id_usuario = registros.id_usuario
    where registros.fecha_hora = (select max(fecha_hora) from registros r where r.id_usuario = usuarios.id_usuario)

    Si tienes un SQL Server moderno que soporte la cláusula over, estoy seguro de que con un poco de esfuerzo se puede escribir una sentencia más eficiente que la anterior usando este mecanismo, pero la que yo te he puesto funciona en todas las versiones antiguas y es fácil de entender.

    Nota: Te he cambiado la antiquísima sintaxis de SQL-86 que estabas usando para unir las tablas por la SQL-92. Aunque la antigua sigue siendo compatible, es menos clara porque no distingue en el where cuáles son las condiciones de unión y cuáles son las condiciones de filtrado. 


    viernes, 3 de julio de 2020 11:22
  • Muchas gracias Alberto por su tiempo, lo probaré y le digo

    Un cordial saludo

    viernes, 3 de julio de 2020 16:22
  • Hola nene31787, 

      

    ¿Alguna novedad sobre la consulta realizada? ¿Han sido útiles las  respuestas proporcionadas?  

    Espero su respuesta.  

    Cualquier duda referente a productos Microsoft, puedes consultarnos. Es un gusto informarte. 

    Gracias por usar los foros de MSDN.  

    Eric Ruiz

    ____________________________  

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.  

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.   

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft. 

    viernes, 3 de julio de 2020 21:01
  • Funciona perfecto, pero ahora tengo un problema, me he dado cuenta que existen trabajadores que nunca han fichado, me gustaría que aparecieran aunque la fecha estuviera en blanco para darme cuenta de quien no ficha

    Agradecerles sus ayudas

    Muchas gracias

    lunes, 6 de julio de 2020 9:26
  • Hola nene31787:

    Puedes aplicar una pequeña variante sobre la query que te ha proporcionado Alberto.

    select usuarios.id_usuario, usuarios.nombre, fn.fecha_hora
    from usuarios 
    outer apply (
    	Select max (fecha_hora) as fecha_hora
    	from registros r2
    	where r2.id_usuario = usuarios.id_usuario 
    	) fn

    Al aplicar el operador outer apply obtienes también los resultados cuya fecha es Null

    • Marcado como respuesta nene31787 martes, 7 de julio de 2020 9:50
    lunes, 6 de julio de 2020 9:51
  • Muchisimas gracias Javi

    Funciona perfecto

    Gracias de verdad a todos

    martes, 7 de julio de 2020 9:50