Doubt group by oracle

Asked

Viewed 44 times

0

I want to do a group by between two tables by doing an Inner Join. The employee table and the table employed at the post. I want it to return to the most recent entry into a post of a given employee. But I’m only getting this by having to delete two query columns, which is the contract post and the entry date in the post:

select 
       max(entrada_posto),
       e.id ,   

       --ep.fk_posto_contrato,
       e.admissao,
       e.demissao,
       --ep.entrada_posto,
       ep.saida_posto

  from TB_EMPREGADO e


    inner join TB_EMPREGADO_NO_POSTO ep

     on e.id = ep.fk_empregado

group by

       e.id ,   

       --ep.fk_posto_contrato,
       e.admissao,
       e.demissao,
       --ep.entrada_posto,
       ep.saida_posto

Whose result is:

"MAX(ENTRADA_POSTO)","ID","ADMISSAO","DEMISSAO","SAIDA_POSTO"
"10/09/2018","1","10/09/2018","",""
"01/10/2020","43","09/13/2019","",""

The complete result with all columns, gives 2 entries for id 43, and I only need the last:

"MAX(ENTRADA_POSTO)","ID","FK_POSTO_CONTRATO","ADMISSAO","DEMISSAO","ENTRADA_POSTO","SAIDA_POSTO"
"01/10/2020","43","42","09/13/2019","","01/10/2020",""
"10/09/2018","1","21","10/09/2018","","10/09/2018",""
"10/09/2019","43","41","09/13/2019","","10/09/2019",""

Is there any way to preserve these columns and only bring the date of entry into the most recent post, to given employee id?

2 answers

0

Make a with or place this information in a sub-query between your columns:

Example 1:

WITH ultima_entrada AS(
SELECT fk_empregado, 
       MAX(entrada_posto) entrada_posto
  FROM tb_empregado_no_posto
 GROUP BY fk_empregado
)

SELECT MAX(entrada_posto), 
       e.id, 
       e.admissao, 
       e.demissao
  FROM tb_empregado e
 INNER JOIN ultima_entrada ep
    ON e.id = ep.fk_empregado

Example 2:

SELECT (SELECT MAX(entrada_posto) entrada_posto
          FROM tb_empregado_no_posto
         WHERE e.id = ep.fk_empregado) entrada_posto, 
       e.id, 
       e.admissao, 
       e.demissao
  FROM tb_empregado e

0

Bruno Warmling,

Thanks for the tips. I tried the solutions, using the two examples and was not very happy in the first using all columns of the table employed_no_post. Maybe I forgot some detail.

In example 1 I used so:

WITH ultima_entrada AS(
SELECT fk_empregado, 
       MAX(entrada_posto) entrada_posto
  FROM tb_empregado_no_posto
 GROUP BY fk_empregado

)

SELECT 
       MAX(ep.entrada_posto),
       e.id, 
       e.admissao, 
       e.demissao,
       ep2.entrada_posto,
       ep2.saida_posto,
       ep2.atualizacao,
       ep2.fk_contexto
  FROM tb_empregado e
 INNER JOIN ultima_entrada ep
    ON e.id = ep.fk_empregado
 INNER JOIN tb_empregado_no_posto ep2 ON e.id = ep2.fk_empregado

group by 
e.id,
e.admissao, 
e.demissao,
ep2.entrada_posto,
ep2.saida_posto,
ep2.atualizacao,
ep2.fk_contexto

Still returned the three records.

In example 2 returned correctly, but when adding the other columns, using an inner of the table used:

SELECT (SELECT MAX(entrada_posto) entrada_posto
          FROM tb_empregado_no_posto ep
         WHERE e.id = ep.fk_empregado) entrada_posto , 
       e.id, 
       e.admissao, 
       e.demissao,
       ep2.saida_posto
  FROM tb_empregado e
       inner join tb_empregado_no_posto ep2 on ep2.fk_empregado = e.id

I tested another approach, similar to example 2 that worked. I added one more comparison in the Inner Join in example 1, adding another Inner. It worked, it was extended and not very pretty, there it goes:

INNER JOIN tb_employ_no_post Ep2 ON e.id = Ep2.fk_employee and Ep2.entrada_posto = Ep.entrada_posto

WITH ultima_entrada AS(
SELECT fk_empregado, 
       MAX(entrada_posto) entrada_posto
  FROM tb_empregado_no_posto
 GROUP BY fk_empregado

)

SELECT 
       MAX(ep.entrada_posto),
       e.id, 
       e.admissao, 
       e.demissao,
       ep2.entrada_posto,
       ep2.saida_posto,
       ep2.atualizacao,
       ep2.fk_contexto
  FROM tb_empregado e
 INNER JOIN ultima_entrada ep
    ON e.id = ep.fk_empregado
 INNER JOIN tb_empregado_no_posto ep2 ON e.id = ep2.fk_empregado and ep2.entrada_posto = ep.entrada_posto

group by 
e.id,
e.admissao, 
e.demissao,
ep2.entrada_posto,
ep2.saida_posto,
ep2.atualizacao,
ep2.fk_contexto

Here the final result:

"MAX(EP.ENTRADA_POSTO)","ID","ADMISSAO","DEMISSAO","ENTRADA_POSTO","SAIDA_POSTO","ATUALIZACAO","FK_CONTEXTO"
"10/09/2018","1","10/09/2018","","10/09/2018","","06-NOV-19 02.47.50.720476 PM","1"
"01/10/2020","43","09/13/2019","","01/10/2020","","10-JAN-20 04.35.40.642123 PM","1"

Here the solution that brings the same result of example 1 adapted:

select ID,FK_POSTO_CONTRATO,FK_EMPREGADO, maior_data.entrada, SAIDA_POSTO,ATUALIZACAO,FK_CONTEXTO FROM tb_empregado_no_posto ep

inner join

(

select ep2.FK_EMPREGADO chave ,max(ep2.ENTRADA_POSTO) entrada FROM tb_empregado_no_posto ep2 group by fk_empregado

) maior_data

on maior_data.chave = ep.fk_empregado and maior_data.entrada = ep.entrada_posto
  • If there is a more effective solution, please let me know.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.