Tengo una tabla que es una colección de entradas para el progreso de los procesos legales.

id_andamento_processo   id_processo data_andamento  hora_andamento  descricao
1   18      2016-05-30  14:00:00    
2   3122    2016-05-18  16:08:54    campo para o texto da PUBLICAÇÃO DO DIÁRIO OFICIAL
3   3122    2016-05-18  16:09:55    campo para o texto da PUBLICAÇÃO DO DIÁRIO OFICIAL
4   3122    2016-05-18  16:13:49    campo para o texto da PUBLICAÇÃO DO DIÁRIO OFICIAL
5   2001    2015-07-15  14:34:54    ANDAMENTO: 30/06/2014 Protocolo (E-Doc 12148046) 10003/2014 (LAT-Laudo Assistente Técnico): PROTOCOLO
6   2001    2015-07-15  14:34:54    ANDAMENTO: 03/07/2014 Protocolo (E-Doc 12174924) 10352/2014 (LPC-Laudo Pericial (Conhecimento)): PROTOCOLO
7   2001    2015-07-15  14:34:54    ANDAMENTO: 15/07/2014 Devolução de Carga

¿Cómo creo una consulta que me dé la última fecha y hora para cada proceso?

He seguido la respuesta a esta pregunta relacionada: ¿cómo consulto sql para una fecha de registro más reciente para cada usuario y puedo obtener la última fecha para cada proceso.

select a.id_processo, a.data_andamento, a.hora_andamento, a.descricao_ptbr
from andamento_processo a
inner join (
    select id_processo, max(data_andamento) as Maxdata_andamento
    from andamento_processo
    group by id_processo
) am on a.id_processo = am.id_processo and a.data_andamento = am.Maxdata_andamento

Sin embargo, esto devuelve el progreso duplicado con la misma fecha y hora diferente:

id_processo     data_andamento  hora_andamento  descricao_ptbr
0   2016-06-09  11:03:00     
18  2016-06-21  11:01:00     
18  2016-06-21  11:12:00    Verificação teste para o RR juridico.
18  2016-06-21  11:37:00    Teste

Intenté agregar un MAX en la hora del progreso, pero no funcionó, algunos progresos desaparecieron. Intenté así:

select a.id_processo, a.data_andamento, a.hora_andamento, a.descricao_ptbr
from andamento_processo a
inner join (
    select id_processo, max(data_andamento) as Maxdata_andamento,   max(hora_andamento) as Maxhora_andamento
from andamento_processo
group by id_processo
) am on a.id_processo = am.id_processo and a.data_andamento = am.Maxdata_andamento and a.hora_andamento = am.Maxhora_andamento

Estoy usando MySQL. Necesito una consulta sin progresos duplicados, como este:

id_processo     data_andamento  hora_andamento  descricao_ptbr
0               2016-06-09      11:03:00     
18              2016-06-21      11:37:00        Teste
1006            2016-05-25      16:10:10        Descrição: Mero expediente (19/05/16) Descrição: Mero expediente (19/05/16) 
1
giancarloap 27 dic. 2016 a las 17:30

3 respuestas

La mejor respuesta

No está claro por qué la fecha y la hora son dos columnas separadas. Tal vez porque pueden ser nulos para ciertos escenarios. Por lo tanto, obtenga los registros para los que se dan ambos (y presumiblemente pertenecen juntos), combínelos en una fecha y hora y trabaje con esto.

select 
  id_processo,
  max(timestamp(data_andamento, hora_andamento))
from andamento_processo
where data_andamento is not null
  and hora_andamento is not null
group by id_processo
order by id_processo;

Si desea obtener más datos de los registros con las fechas y horas máximas, use las anteriores como una subconsulta (tabla derivada) y vuelva a unirse a la tabla.

Para completar: aquí la misma consulta en una cláusula IN para obtener más datos de los registros:

select *
from andamento_processo
where (id_processo, timestamp(data_andamento, hora_andamento)) in
(
  select 
    id_processo,
    max(timestamp(data_andamento, hora_andamento))
  from andamento_processo
  where data_andamento is not null
    and hora_andamento is not null
  group by id_processo
)
order by id_processo;
1
Thorsten Kettner 27 dic. 2016 a las 16:57
select a.id_processo,
       a.data_andamento,
       a.hora_andamento,
       a.descricao_ptbr
from andamento_processo a
inner join
(
    select id_processo,
           max(data_andamento) as Maxdata_andamento
    from andamento_processo
    group by id_processo,
             date_format(data_andamento, '%Y-%m-%d %H')
) am
    on a.id_processo = am.id_processo and
       a.data_andamento = am.Maxdata_andamento
0
Tim Biegeleisen 27 dic. 2016 a las 14:48

Puede agregar data_andamento en el grupo por cláusula.

select a.id_processo, a.data_andamento, a.hora_andamento, a.descricao_ptbr
from andamento_processo a
inner join (
    select id_processo, max(data_andamento) as Maxdata_andamento,
    max(hora_andamento) as Maxhora_andamento
from andamento_processo
group by id_processo, data_andamento
) am on a.id_processo = am.id_processo and a.data_andamento =    
am.Maxdata_andamento and a.hora_andamento = am.Maxhora_andamento
0
ProgAndPlay 27 dic. 2016 a las 14:41