none
HELP !! Agrupar fila y mostrar el registro mas reciente . Debe funcionar para MYSQL RRS feed

  • Pregunta

  • Buenas tardes, Necesito hacer una consulta que me regrese el cargo actual de todos los empleado guardados en mi base de datos. He intentado varias cosas y aun no he logrado.

    mis tablas son las siguientes : empleado, historialcargo, cargo.

    en la tabla historialCargo esta almacenado lo siguiente: 

    id id_e id_c

    1  1    1

    2  1    2

    3  1    3

    4  21   2

    5  1     13

    Necesito agrupar por id_empleado y mostrar el ultimo id_cargo de cada empleado para que quede algo asi:

    id id_e id_c

    4  21   2

    5  1     13


    • Editado Roxnny domingo, 13 de octubre de 2019 22:15 No especifique la plataforma
    domingo, 13 de octubre de 2019 21:23

Respuestas

Todas las respuestas

  • Hola Roxny:

    Puedes utilizar una tabla derivada, para obtener el máximo id y luego cruzarla con tu origen de datos.

    declare @table table (id int, id_e int, id_C int)
    insert into @table 
    values
    (1,1,1),
    (2,1,2),
    (3,1,3),
    (4,21,2),
    (5,1,13);

    En la variable de tabla @table esta tu origen de datos.

    select interior.* , t.id_C 
        from (
    	   select MAX(id) as id, id_e
    	   from @table 
    	   group by id_e
    	   ) as interior 
       inner join @table t on interior.id = t.id

    Salida

    Tablas derivadas

    https://javifer2.blogspot.com/search/label/Tabla%20derivadas

    Group by

    https://javifer2.blogspot.com/search/label/group%20by

    • Marcado como respuesta Roxnny lunes, 14 de octubre de 2019 0:03
    domingo, 13 de octubre de 2019 21:55
  • Necesito hacer una consulta que me regrese el cargo actual de todos los empleado guardados en mi base de datos.

    ¿En la tabla historialcargo hay una columna que informe en qué fecha se produjo el cambio de cargo?

    Esta es otra sugerencia, además de la que ya ha propuesto Javier:

    -- código #1 v2
    SELECT E.id, E.nombre_empleado, C.nombre_cargo
      from EMPLEADO as E
           outer apply (SELECT top (1) T.id_c
                          from HISTORIALCARGO as T
                          where T.id_e = E.id
                          order by T.fecha desc) as HC
           left join CARGO as C on C.id = HC.id_c;
     

    o entonces

    -- código #2 v2
    with UltCargo as (
    SELECT *, 
           row_number() over (partition by id_e order by fecha desc) as seq
      from HISTORIALCARGO
    )  
    SELECT E.id, E.nombre_empleado, C.nombre_cargo
      from EMPLEADO as E
           left join UltCargo as HC on HC.id_e = E.id and HC.seq = 1
           left join CARGO as C on C.id = HC.id_c;

    Si esta respuesta te ayudó a resolver tu problema, recuerda marcarla.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz domingo, 13 de octubre de 2019 22:30
    domingo, 13 de octubre de 2019 22:04
  • Disculpe, es que soy nuevo es esta plataforma, eso tambien puede aplicar si mi gestor de base de datos es mysql ?
    domingo, 13 de octubre de 2019 22:10
  • Si, la tabla historialCargo tiene la fecha 
    domingo, 13 de octubre de 2019 22:26
  • Disculpe, es que soy nuevo es esta plataforma, eso tambien puede aplicar si mi gestor de base de datos es mysql ?

    OUTER APPLY es una extensión SQL de SQL Server; no funciona en MySQL. El código #2 puede funcionar en MySQL, siempre y cuando la versión sea 8.0 (o posterior).

    Sobre MySQL, te sugiero que publiques tu pregunta en los foros específicos de MariaDB/MySQL:



    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz domingo, 13 de octubre de 2019 23:49
    domingo, 13 de octubre de 2019 22:27
  • Buenas tardes, Necesito hacer una consulta que me regrese el cargo actual de todos los empleado guardados en mi base de datos. He intentado varias cosas y aun no he logrado.

    mis tablas son las siguientes : empleado, historialcargo, cargo.

    en la tabla historialCargo esta almacenado lo siguiente: 

    id id_e id_c

    1  1    1

    2  1    2

    3  1    3

    4  21   2

    5  1     13

    Necesito agrupar por id_empleado y mostrar el ultimo id_cargo de cada empleado para que quede algo asi:

    id id_e id_c

    4  21   2

    5  1     13


    Muchas gracias a los que respondieron a mi pregunta, me ayudaron mucho.

    Asi quedo la query después de leer sus sugerencias:
    SELECT  i.id
           ,i.id_empleado
           ,t.id_cargo
           ,t.cargo 
           ,i.fechaCambio
    FROM 
    (
    	SELECT  MAX(hc.id) AS id
    	       ,hc.id_empleado
    	       ,fechaCambio
    	FROM 
    	(
    		SELECT  *
    		FROM `historialcargo`
    	) AS hc
    	GROUP BY  hc.id_empleado
    ) AS i
    INNER JOIN 
    (
    	SELECT  c.cargo
    	       ,hc.*
    	FROM `historialcargo` AS hc
    	INNER JOIN `cargo` AS c
    	ON hc.id_cargo = c.id
    ) AS t
    ON i.id = t.id 

    lunes, 14 de octubre de 2019 0:02