Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie wähle ich das späteste Datum aus dieser Abfrage aus (nicht in einer vorhandenen Tabelle)?

Ich denke, das reicht.

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

Die Ergebnisse aus den von Ihnen bereitgestellten Daten sind:

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

Ich bin besser mit T-SQL vertraut, wo ich die Fensterfunktion row_number() verwenden würde. Die Idee ist, dass das Feld row_number eine Rangfolge jeder Zeile in Bezug darauf anzeigt, ob es sich um die neueste (Wert 1), zweitletzte (Wert 2) usw. Aktion für jede Aufgabe handelt. Die letzte Aktion für jede Aufgabe endet mit einer row_number von 1, sodass Sie diese herausbekommen können, indem Sie nach row_number =1 aus dieser latest_action filtern Unterabfrage.

Da die latest_action Unterabfrage insgesamt einmal ausgeführt wird, nicht einmal pro Zeile, ist dies keine große Leistungseinbuße. Leider kann ich nicht versprechen, dass das ganze Setzen/Inkrementieren von Variablen kein großer Leistungseinbruch ist, dies ist das erste Mal, dass ich diese Logik in MySQL verwende, ich weiß nicht, wie leistungsfähig sie ist.

Die Logik zum Reproduzieren der row_number()-Funktionalität von T-SQL stammt von hier: ROW_NUMBER() in MySQL