Mysql将平均结果与单个查询中的当前结果进行比较

时间:2016-08-08 22:32:20

标签: mysql

我想知道是否可以运行一个告诉我以下内容的查询:

  

获取具有(当前正在执行)作业超过平均历史运行时间的任何应用程序的名称

表1:工作经历

  • 工作开始时间
  • 工作结束时间
  • 工作状态(成功,失败,执行等)
  • 触发作业的应用程序ID

表2:应用程序

  • ID
  • 名称

这似乎是一个简单的问题,但是创建一个mysql查询已被证明是一个相当复杂的(虽然有趣)挑战......

查询需要抓取 satus = executing 的作业,使用 application.id 查找匹配的其他作业application.id status = success ,平均end_time - start_time,然后比较使用当前正在执行的作业的average time - current_time start_time 。最后,它必须使用未通过此测试的任何作业中的应用程序ID从应用程序表中获取 application.name 。这甚至可以在一个查询中完成吗?

为了这个问题,让我们假设 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 的当前运行时间进行比较。如果当前运行时间大于平均运行时间,那么我想报告应用程序名称: Team Green的应用程序

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,可以使用from types import StringType, UnicodeType from typing import Union MyStringTypes = Union[StringType, UnicodeType] def f(value): # type: (MyStringTypes) -> MyStringTypes return value 作为一个选项。从这里开始,您可以根据需要轻松调整join条件:

where