如何查询sql以获取每个用户的最新记录日期和时间

时间:2016-12-27 14:30:05

标签: mysql sql date time group-by

我有一张表,是法律程序进展的集合条目。

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

如何创建一个查询,为我提供每个流程的最新日期和时间?

我跟随了这个相关问题的aswer: how do I query sql for a latest record date for each user 我能够获得每个流程的最新日期。

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

但是,这将返回具有相同日期和不同时间的重复进度:

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

我试着在进度的一小时内添加一个MAX,但是没有工作,一些进展消失了。我试过这样:

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

我正在使用MySQL。我需要一个没有重复进展的查询,如下所示:

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) 

3 个答案:

答案 0 :(得分:1)

目前尚不清楚为什么日期和时间是两个单独的列。也许是因为某些情况下它们可能为空。因此,获取两者都给出的记录(并且可能属于一起),将它们组合到一个日期时间并使用它。

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;

如果您想从具有最大日期时间的记录中获取更多数据,则使用上面作为子查询(派生表)并再次加入该表。

为了完整起见:在IN子句中使用相同的查询来从记录中获取更多数据:

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 :(得分:0)

您可以在group by子句中添加data_andamento。

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

答案 2 :(得分:0)

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