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

MySQL制限、グループ、およびAVGクエリ

    私の最初の反応は、LIMITを使用して平均を5つの結果に制限することでした。そのため、次のように提案しました。

    select a.host, avg(a.execution_time) from (select id, execution_time, host from jobs order by id desc limit 5) a group by a.host;
    

    ただし、これにより、平均がホストごとの最新の5つのジョブではなく、最新の5つのジョブに制限されることは明らかです。

    ある種のストアドプロシージャを使用せずに、LIMITを使用して平均を制限することは難しいようです。そのため、mysql変数を使用して、各ジョブにホストごとの完了順序または位置を割り当てることを検討しました。

    これはテストされていませんが、それが示す理論は良い出発点になるはずです:

    まず、ホストに基づいて各ジョブに位置を割り当てる必要があります。

    select
      host, 
      execution_time,
      @current_pos := if (@current_host = host, @current_pos, 0) + 1 as position,
      @current_host := host
    from
      (select @current_host := null, @current_pos := 0) set_pos,
      jobs
    order by
      host,
      id desc;
    

    位置を設定したら、集計関数を選択して、結果を上位5つの位置に制限します。

    select
      jt.host,
      avg(jt.execution_time)
    from
      (
      select
        host, 
        execution_time,
        @current_pos := if (@current_host = host, @current_pos, 0) + 1 as position,
        @current_host := host
      from
        (select @current_host := null, @current_pos := 0) set_pos,
        jobs
      order by
        host,
        id desc
      ) jt
    where
      jt.position <= 5
    group
      by host;
    

    これがあなたのために働くかどうか、または私が考慮していない他の側面があるかどうか私に知らせてください。これは興味深い問題です。



    1. SQLAlchemyの`create_engine`で`charset`と`encoding`を使用する方法(パンダデータフレームを作成するため)?

    2. mysqlの配列変数

    3. Windows732ビットへのOracle11gRelease 2EnterpriseEditionのインストール

    4. MySQLのマルチスレッド?