sql >> Database teknologi >  >> RDS >> Mysql

MySQL Limit, Group og AVG Query

Min første reaktion var at bruge LIMIT til at begrænse gennemsnittet til 5 resultater, hvilket fik mig til at foreslå:

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 er klart, at dette begrænser gennemsnittet til de seneste 5 jobs og ikke de seneste 5 jobs pr. vært.

Det synes svært at bruge LIMIT til at begrænse gennemsnittet uden at bruge en form for lagret procedure. Dette fik mig til at overveje at tildele hvert job en fuldførelsesordre eller stilling pr. vært ved hjælp af en mysql-variabel.

Dette er uafprøvet, men den teori, det illustrerer, burde være et godt udgangspunkt:

Først bør vi tildele hvert job en stilling baseret på dens vært:

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 etableret positionen, skal du blot vælge den samlede funktion, hvilket begrænser resultaterne til de øverste 5 positioner:

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;

Fortæl mig venligst, om dette virker for dig, eller hvis der er flere aspekter, jeg ikke har overvejet. Dette er et spændende problem.



  1. ETIMEDOUT fejl ved forespørgsel i mysql database

  2. SQL:Kan jeg henvise/få adgang til data i den aktuelle række i en vinduesfunktion?

  3. Fejl:ORA-00955:Navn bruges allerede af et eksisterende objekt i Oracle Function

  4. Hvordan kontrollerer man, om der findes en database i SQL Server?