sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo seleccionar la última fecha de esta consulta (no en una tabla existente)?

Creo que esto lo hace.

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

Los resultados de los datos que proporcionó son:

+---------+-----------------+------------+-----------+
| 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   |
+---------+-----------------+------------+-----------+

Estoy más familiarizado con T-SQL, donde usaría la función de ventana row_number(). La idea es hacer que el campo número_fila muestre una clasificación de cada fila en términos de si es la acción más reciente (valor 1), la segunda más reciente (valor 2), etc. para cada tarea. La acción más reciente para cada tarea termina con un número de fila de 1, por lo que puede obtenerlos filtrando por número de fila =1 de esta latest_action subconsulta

Porque la latest_action la subconsulta se ejecuta una vez en general, no una vez por fila, no es un gran impacto en el rendimiento. Desafortunadamente, no puedo prometer que toda la variable configuración / incremento no sea un gran impacto en el rendimiento, esta es la primera vez que uso esta lógica en MySQL, no sé qué rendimiento tiene.

La lógica de cómo reproducir la funcionalidad row_number() de T-SQL proviene de aquí: ROW_NUMBER() en MySQL