sql >> データベース >  >> RDS >> Mysql

このクエリから(既存のテーブルではなく)最新の日付を選択するにはどうすればよいですか?

    これでうまくいくと思います。

    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
    

    提供したデータの結果は次のとおりです。

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

    私は、row_number()ウィンドウ関数を使用するT-SQLに精通しています。アイデアは、row_numberフィールドに、各タスクの最新(値1)、2番目に新しい(値2)などのアクションの観点から各行のランキングを表示させることです。各タスクの最新のアクションはrow_numberが1になるため、このlatest_actionからrow_number=1でフィルタリングすることでこれらを取得できます。 サブクエリ。

    latest_action サブクエリは、行ごとに1回ではなく、全体で1回実行されますが、パフォーマンスに大きな影響はありません。残念ながら、変数の設定/インクリメント全体がパフォーマンスに大きな影響を与えないことを約束することはできません。MySQLでこのロジックを使用したのはこれが初めてで、パフォーマンスがどれほどかはわかりません。

    T-SQLのrow_number()機能を再現する方法のロジックは、次のとおりです。 MySQLのROW_NUMBER()




    1. postgresの切り捨てが遅い

    2. ストアドプロシージャまたは関数は、提供されていないパラメータを予期しています

    3. Node.jsにハードコードされたmysqlユーザーとパスワード

    4. テキスト検索クエリなしでsphinxとMySQLを使用する