Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como selecionar a data mais recente desta consulta (não em uma tabela existente)?


Eu acho que isso faz isso.
select
  t_task.task_id,
  t_task.task_name,
  latest_action.act_date,
  IFNULL(t_act_d.act_name, 'Pending') as act_name
from
  t_task
  left outer join (
    select
      @row_num := IF(@prev_value=concat_ws('', t_act.task_id),@row_num+1, 1) as row_number,
      t_act.task_id,
      t_act.act_id,
      t_act.act_date,
      @prev_value := concat_ws('', t_act.task_id) as z
    from
      t_act,
      (select @row_num := 1) x,
      (select @prev_value := '') y
    order by
      t_act.task_id,
      t_act.act_date desc
  ) as latest_action on
    t_task.task_id = latest_action.task_id
  left outer join t_act_d on
    latest_action.act_id = t_act_d.act_id
where
  latest_action.row_number = 1 or
  latest_action.row_number is null
order by
  case when latest_action.act_date is null then '9999-01-01' else latest_action.act_date end

Os resultados dos dados fornecidos são:
+---------+-----------------+------------+-----------+
| task_id | task_name       | act_date   | act_name  |
+---------+-----------------+------------+-----------+
| A1      | PC  Proc        | 2017-07-17 | Execution |
| A2      | Printer  Proc   | 2017-07-21 | Surveying |
| A3      | Stationery Proc | NULL       | Pending   |
+---------+-----------------+------------+-----------+

Estou mais familiarizado com o T-SQL, onde usaria a função de janela row_number(). A idéia é fazer com que o campo row_number mostre uma classificação de cada linha em termos de se é a ação mais recente (valor 1), segunda mais recente (valor 2) etc. para cada tarefa. A ação mais recente de cada tarefa termina com um número_linha de 1, então você pode obtê-las filtrando em número_linha =1 desta latest_action subconsulta.

Porque a latest_action a subconsulta é executada uma vez no geral, não uma vez por linha, não é um grande impacto no desempenho. Infelizmente, não posso prometer que toda a configuração / incremento de variável não seja um grande impacto no desempenho, esta é a primeira vez que uso essa lógica no MySQL, não sei qual é o desempenho.

A lógica de como reproduzir a funcionalidade row_number() do T-SQL veio daqui: ROW_NUMBER() no MySQL