none
Seleccionar el ultimo registros de cada usuario sql server RRS feed

  • Pregunta

  • Hola podrían ayudarme a realizar la siguiente consulta en la cual mande a llamar solo el ultimo registro echo por cada usuario 

    trabajo en sql server 2008

    muchas gracias espero me puedan ayudar

    martes, 15 de enero de 2019 19:56

Respuestas

  • Hola Jovany Carbajal:

    No me había llegado la imagen, de ahí que no entendiera tu petición.

    Create table activities (Nombre varchar(100), matricula int, fecha varchar(12), actividad varchar(100))
    go
    insert into activities 
    values
    ('Jorge',2012253,'10-05-17','Trabaja en Telefonos'),
    ('Daniel',2012264,'10-05-17','No realiza ninguna actividad'),
    ('Sergio',2012270,'10-05-17','Trabaja en Pemex'),
    ('Dulce',2012280,'10-05-17','Secretaria'),
    ('Maria',2012290,'10-05-17','No realiza ningún proyecto'),
    ('Jorge',2012253,'14-08-17','Continua trabajando el Teléfonos'),
    ('Daniel',2012264,'12-09-17','Envio CVR a empresas'),
    ('Sergio',2012270,'10-10-17','Continua trabajando el Pemex'),
    ('Dulce',2012280,'14-10-17','Secretaria en dirección'),
    ('Maria',2012290,'15-11-17','No trabaja '),
    ('Jorge',2012253,'14-08-18','Subdirector en Teléfonos'),
    ('Daniel',2012264,'12-09-18','Entro a trabajar en empresa privada'),
    ('Dulce',2012280,'14-10-18','Continua trabajando Secretaria en dirección')
    go
    /*Escenario*/
    

    Solución utilizando Row number para numerar las filas por orden:

    ;WITH cte
         AS (SELECT a.nombre, 
                    a.matricula, 
                    (CAST(fecha AS DATE)) AS fechaDate, 
                    a.actividad, 
                    ROW_NUMBER() OVER(PARTITION BY a.nombre
                    ORDER BY CAST(fecha AS DATE) DESC) AS fila
             FROM activities a)
         SELECT *
         FROM cte
         WHERE fila = 1
         ORDER BY matricula;

    Salida

    Row_number

    https://docs.microsoft.com/es-es/sql/t-sql/functions/row-number-transact-sql?view=sql-server-2017

    • Marcado como respuesta Jovany Carbajal miércoles, 16 de enero de 2019 19:56
    martes, 15 de enero de 2019 21:59
  • Hola, le pongo un ejemplo y lo adecua a sus necesidades, si tiene inconvenientes nos comenta

    Create table #Datos (ID int, Name char(10), TheDate datetime)

    insert into #Datos values(123,'John','01/02/2012')

    ,(123,'John','01/03/2012')

    ,(123,'Doe','01/01/2012')

    ,(456,'Smith','02/04/2012')

    ,(789,'Smith','02/01/2012')

    ,(789,'Smith','02/09/2012')

    ,(789,'Roger','02/08/2012')

    WITH e AS (  SELECT *,  ROW_NUMBER() OVER  (PARTITION BY CONVERT(VARCHAR(100),ID) + ' ' + Name    

    ORDER BY theDate DESC  ) AS Recency  FROM #Datos )

    SELECT * FROM e WHERE Recency = 1



    IIslas Master Consultant SQL Server

    • Marcado como respuesta Jovany Carbajal miércoles, 16 de enero de 2019 19:56
    martes, 15 de enero de 2019 21:33

Todas las respuestas

  • Hola Jovany Crabajal:

    Creo que tienes que especificar un poco más tu consulta.

    Cuando dices el último registro echo por cada usuario. USUARIOS sql server, o usuarios de tu aplicación????

    Cuando dices el útlimo registro..... quieres decir la ultima insercción, o la ultima actualizacion, o la ultima lectura.

    Toda información que puedas aportar sobre lo que necesitas, y como es tu sistema, será bienvenida, para una mejor solución a tu pregunta.

    martes, 15 de enero de 2019 20:13
  • Hola Jovany Crabajal:

    Creo que tienes que especificar un poco más tu consulta.

    Cuando dices el último registro echo por cada usuario. USUARIOS sql server, o usuarios de tu aplicación????

    Cuando dices el útlimo registro..... quieres decir la ultima insercción, o la ultima actualizacion, o la ultima lectura.

    Toda información que puedas aportar sobre lo que necesitas, y como es tu sistema, será bienvenida, para una mejor solución a tu pregunta.

    hola estoy haciendo un registro de actividades y quiero hacer una consulta en la cual solo me arroje el ultimo registro de actividad guardado de cada usuario de mi aplicación asi esta mi tabla:

    Nombre  - Matricula -   Fecha     -  Actividad

    Jorge     - 2012253  -   10-05-17    - Trabaja en Telefonos

    Daniel    - 2012264  -   10-05-17    - No realiza ninguna actividad

    Sergio    - 2012270  -   10-05-17    - Trabaja en Pemex

    Dulce     - 2012280  -   10-05-17   -  Secretaria

    Maria     - 2012290  -    10-05-17   - No realiza ningún proyecto

    Jorge     - 2012253  -    14-08-17   - Continua trabajando el Teléfonos

    Daniel    - 2012264  -    12-09-17   - Envio CVR a empresas

    Sergio    - 2012270  -    10-10-17   -   Continua trabajando el Pemex

    Dulce     - 2012280  -    14-10-17   -  Secretaria en dirección

    Maria     - 2012290  -    15-11-17   - No trabaja 

    Jorge     - 2012253  -    14-08-18   - Subdirector en Teléfonos

    Daniel    - 2012264  -    12-09-18   - Entro a trabajar en empresa privada

    Dulce     - 2012280  -    14-10-18   -  Continua trabajando Secretaria en dirección

    necesito la ultima actividad registrada de cada usuario

    Nombre  - Matricula -   Fecha     -  Actividad

    Jorge     - 2012253  -    14-08-18   - Subdirector en Teléfonos

    Daniel    - 2012264  -    12-09-18   - Entro a trabajar en empresa privada

    Sergio    - 2012270  -    10-10-17   -   Continua trabajando el Pemex

    Dulce     - 2012280  -    14-10-18   -  Continua trabajando Secretaria en dirección

    Maria     - 2012290  -    15-11-17   - No trabaja 

    espero y si me puedas ayudar.


    martes, 15 de enero de 2019 21:18
  • Hola, le pongo un ejemplo y lo adecua a sus necesidades, si tiene inconvenientes nos comenta

    Create table #Datos (ID int, Name char(10), TheDate datetime)

    insert into #Datos values(123,'John','01/02/2012')

    ,(123,'John','01/03/2012')

    ,(123,'Doe','01/01/2012')

    ,(456,'Smith','02/04/2012')

    ,(789,'Smith','02/01/2012')

    ,(789,'Smith','02/09/2012')

    ,(789,'Roger','02/08/2012')

    WITH e AS (  SELECT *,  ROW_NUMBER() OVER  (PARTITION BY CONVERT(VARCHAR(100),ID) + ' ' + Name    

    ORDER BY theDate DESC  ) AS Recency  FROM #Datos )

    SELECT * FROM e WHERE Recency = 1



    IIslas Master Consultant SQL Server

    • Marcado como respuesta Jovany Carbajal miércoles, 16 de enero de 2019 19:56
    martes, 15 de enero de 2019 21:33
  • Hola Jovany Carbajal:

    No me había llegado la imagen, de ahí que no entendiera tu petición.

    Create table activities (Nombre varchar(100), matricula int, fecha varchar(12), actividad varchar(100))
    go
    insert into activities 
    values
    ('Jorge',2012253,'10-05-17','Trabaja en Telefonos'),
    ('Daniel',2012264,'10-05-17','No realiza ninguna actividad'),
    ('Sergio',2012270,'10-05-17','Trabaja en Pemex'),
    ('Dulce',2012280,'10-05-17','Secretaria'),
    ('Maria',2012290,'10-05-17','No realiza ningún proyecto'),
    ('Jorge',2012253,'14-08-17','Continua trabajando el Teléfonos'),
    ('Daniel',2012264,'12-09-17','Envio CVR a empresas'),
    ('Sergio',2012270,'10-10-17','Continua trabajando el Pemex'),
    ('Dulce',2012280,'14-10-17','Secretaria en dirección'),
    ('Maria',2012290,'15-11-17','No trabaja '),
    ('Jorge',2012253,'14-08-18','Subdirector en Teléfonos'),
    ('Daniel',2012264,'12-09-18','Entro a trabajar en empresa privada'),
    ('Dulce',2012280,'14-10-18','Continua trabajando Secretaria en dirección')
    go
    /*Escenario*/
    

    Solución utilizando Row number para numerar las filas por orden:

    ;WITH cte
         AS (SELECT a.nombre, 
                    a.matricula, 
                    (CAST(fecha AS DATE)) AS fechaDate, 
                    a.actividad, 
                    ROW_NUMBER() OVER(PARTITION BY a.nombre
                    ORDER BY CAST(fecha AS DATE) DESC) AS fila
             FROM activities a)
         SELECT *
         FROM cte
         WHERE fila = 1
         ORDER BY matricula;

    Salida

    Row_number

    https://docs.microsoft.com/es-es/sql/t-sql/functions/row-number-transact-sql?view=sql-server-2017

    • Marcado como respuesta Jovany Carbajal miércoles, 16 de enero de 2019 19:56
    martes, 15 de enero de 2019 21:59