2016-08-08 60 views
1

我想知道是否有可能运行,告诉我一个查询以下内容:
Mysql的比较当前结果平均结果在一个查询

得到有任何应用程序的名称(目前执行)工作超过历史平均运行时间

表1:作业历史

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

表2

  • 应用程序ID:应用

    • ID
    • 名称

    这似乎是一个简单的问题来回答,但创建一个MySQL查询已被证明是一个相当复杂的(尽管是耐人寻味的)挑战...

    查询需要抓住就业机会,其中satus = executing,使用application.id寻找那些有其他工作相匹配的application.idstatus = success,平均的end_time - start_time,然后比较average timecurrent_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 | 
    +------+------------------+ 
    

    我想抓住作业4,使用application_id找到JOB1作业3。然后取平均运行时间job1job3,并将其与当前运行时间job4进行比较。如果当前运行时间大于平均运行时间,那么我想报告应用程序名称:Team 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 ='execution'。 –

    +0

    @EthanStrider - 根据你的评论('有一个匹配的application.id和status = success'),这就是'join'和子查询正在完成的事情。它返回'avg'时间,以便您可以将它与仍在外部主“where”条件下执行的那些进行比较。你有没有尝试过,是否返回不正确的结果? – sgeddes

    +0

    正在执行的作业与已完成的作业存储在同一个表中。因此,我需要首先获取活动作业,然后使用application_id标识已成功完成的历史作业。然后以历史作业的平均时间结束运行,并将*返回*到活动作业,并将平均运行时间与当前运行时间进行比较。我会用一些示例数据更新我的描述。 –