Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL Limit, Group и AVG Query

Първоначалната ми реакция беше да използвам 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Неуспех на сериализацията:Открита застой при опит за заключване

  2. преди вмъкване на тригер за вмъкване на дублиращи се редове в друга таблица

  3. Как да създадете връзка много към много в SQLAlchemy (python, flask) за модел Потребител към себе си

  4. Големи MySQL таблици

  5. laravel 5.6 групово вмъкване на json данни