2016-08-08 6 views
1

мне интересно, если это возможно, чтобы запустить один запрос, который говорит мне следующее:
Mysql сравнить средние результаты с текущим результатом в одном запросе

Получить имена всех приложений, которые имеют (в настоящее время выполнение заданий), превышающие среднюю историческую среду выполнения

Таблица 1: История Работа

  • Время начала работы
  • конец работы время
  • статус работы (успех, неудача, выполнение и т.д.)
  • Application ID, который вызвал работу

Таблица 2: Приложения

  • ID
  • Имя

Казалось бы, простой вопрос, чтобы ответить, но создание запроса MySQL доказал быть достаточно сложным (хотя и интригующим) вызов ...

Запрос должен захватить рабочие места, где satus = executing, используйте application.id искать другие рабочие места, которые имеют соответствующие application.id и status = success, усреднить (end_time - start_time), а затем сравнить average time с (current_time - start_time) из текущих выполняемых работ. Наконец, он должен использовать идентификатор приложения из любых заданий, которые не прошли этот тест, чтобы захватить из таблицы приложений. Возможно ли это сделать в одном запросе?

Для этого вопроса давайте предположим, что current_time передается в качестве аргумента.

Я сделал попытку тройного вложенного запроса, но я получаю следующую ошибку, и я не знаю почему. Я потратил несколько часов, пытаясь получить эту работу, но я уже над моей головой здесь:

ERROR 1054 (42S22): Unknown column 'jh.start_time' in 'having clause'

Это моя попытка:

SELECT name FROM application 
WHERE application.id IN (
    SELECT application_id 
    FROM job_history AS jh 
    WHERE application_id IN (
     SELECT application_id 
     FROM job_history 
     WHERE status='EXECUTION') 
    AND jh.status='SUCCESS' 
    HAVING (avg(jh.end_time - jh.start_time)) < (current_time - jh.start_time) 
    ); 

Изменить: предлагается, вот несколько выборочных данных.

Таблица 1

+--------+------------+------------+----------+----------------+ 
| job_id | status | start_time | end_time | application_id | 
+--------+------------+------------+----------+----------------+ 
| job1 | successful |  100 |  200 | app1   | 
| job2 | failed  |  150 |  350 | app2   | 
| job3 | successful |  200 |  400 | app1   | 
| job4 | execution |  500 |  0 | app1   | 
| job5 | successful |  600 |  800 | app3   | 
+--------+------------+------------+----------+----------------+ 

Таблица 2

+------+------------------+ 
| id |  name  | 
+------+------------------+ 
| app1 | Team Green's app | 
| app2 | Team Blue's app | 
| app3 | Team Red's app | 
+------+------------------+ 

Я хотел бы, чтобы захватить job4, используйте application_id найти job1 и job3. Затем возьмите среднее время работы job1 и job3 и сравните его с текущим временем выполнения job4. Если текущее время выполнения больше среднего времени выполнения, то я хотел бы сообщить имя приложения: Приложение команды Green Green.

+0

Вы могли бы иметь больше успеха, если вы предоставите данные выборки и ожидаемые результаты. – sgeddes

ответ

1

Если я правильно понимаю ваш вопрос, вот один из вариантов: join. Отсюда легко настроить where критерии для ваших потребностей:

select distinct a.name 
from applications a 
    join jobhistory jh on a.id = jh.applicationid 
    join (
     select applicationid, avg(endtime - starttime) avgtime 
     from jobhistory 
     where status = 'success' 
     group by applicationid 
    ) t on a.id = t.applicationid 
where jh.status = 'execution' and 
    @current_time - jh.starttime > t.avgtime 
+0

Ницца! Мне нравится, где это происходит, но разве это не приведет только к результатам с статусами «успеха»? Или в этом случае набор empy, потому что позже мы будем искать status = 'execute'. –

+0

@EthanStrider - за ваш комментарий ('которые имеют соответствующий application.id и status = success'), вот что выполняет' join' и подзапрос. Он возвращает время 'avg', поэтому вы можете сравнить его с теми, которые все еще выполняются во внешних основных критериях' where'. Вы уже пробовали это, вернули ли он неправильные результаты? – sgeddes

+0

Работы, которые активно выполняются, хранятся в той же таблице, что и заданные задания. Итак, сначала мне нужно сначала захватить активные задания, а затем использовать application_id для идентификации успешно завершенных исторических заданий. Затем возьмите среднее время исторических заданий, чтобы закончить работу и вернуться * назад * к активным заданиям и сравнить среднее время выполнения с текущим временем выполнения. Я обновляю свое описание выше с некоторыми примерами данных. –

Смежные вопросы