sql >> Databasteknik >  >> RDS >> Mysql

MySQL Limit, Group och AVG Query

Min första reaktion var att använda LIMIT för att begränsa genomsnittet till 5 resultat, vilket fick mig att föreslå:

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;

Men det är tydligt att detta begränsar genomsnittet till de senaste fem jobben och inte de senaste fem jobben per värd.

Det verkar svårt att använda LIMIT för att begränsa genomsnittet, utan att använda någon form av lagrad procedur. Detta fick mig att överväga att tilldela varje jobb en slutförandeorder eller position per värd med hjälp av en mysql-variabel.

Detta är oprövat, men teorin som den illustrerar borde vara en bra utgångspunkt:

Först bör vi tilldela varje jobb en position baserat på dess värd:

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;

När du har fastställt positionen väljer du bara sammanställningsfunktionen, vilket begränsar resultaten till de fem bästa positionerna:

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;

Meddela mig om detta fungerar för dig eller om det finns fler aspekter som jag inte har beaktat. Det här är ett spännande problem.



  1. Postgresql transaktionshantering med java

  2. MySQL 5.6 skapa vy med unicode-teckenuppsättning

  3. Sails kan inte ansluta till mySql

  4. Hitta punkt i polygon PHP