sql >> Database >  >> RDS >> Mysql

MySQL-limiet, groep en AVG-query

Mijn eerste reactie was om LIMIT te gebruiken om het gemiddelde te beperken tot 5 resultaten, wat me ertoe bracht het volgende voor te stellen:

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;

Maar het is duidelijk dat dit het gemiddelde beperkt tot de meest recente 5 jobs, en niet de meest recente 5 jobs per host.

Het lijkt moeilijk om LIMIT te gebruiken om het gemiddelde te beperken, zonder een soort opgeslagen procedure te gebruiken. Dit bracht me ertoe om aan elke taak een voltooiingsvolgorde of positie per host toe te wijzen met behulp van een mysql-variabele.

Dit is niet getest, maar de theorie die het illustreert zou een goed uitgangspunt moeten zijn:

Eerst moeten we elke taak een positie toewijzen op basis van de host:

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;

Na het vaststellen van de positie, selecteert u gewoon de aggregatiefunctie, waarbij de resultaten worden beperkt tot de top 5 posities:

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;

Laat het me weten als dit voor u werkt, of als er meer aspecten zijn waar ik niet aan heb gedacht. Dit is een intrigerend probleem.



  1. Data.sql MySQL Docker-container importeren

  2. MySQL Joins:kiezen uit welke tabel u wilt deelnemen op basis van brontabelgegevens

  3. Mysql-functie om niet-null-waarden te transformeren

  4. Aanwezigheid creëren in laravel