2016-08-08 92 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標識已成功完成的歷史作業。然後以歷史作業的平均時間結束運行,並將*返回*到活動作業,並將平均運行時間與當前運行時間進行比較。我會用一些示例數據更新我的描述。 –