2014-08-28 90 views
0

我對SQL相當陌生,無法找到正在嘗試完成的正確命令。MySql運行時間總計取決於票務狀態

我們有一個票務系統,可以讓我們把車票擱置。我正在嘗試製作一份只顯示票證處於非持有狀態的時間的報告。

我在MySQL工作臺上運行查詢。

這裏是我的查詢,收集我需要實現我的目標的信息:

select ID, HD_TICKET_ID, TIMESTAMP, 

case when DESCRIPTION LIKE '%opened" to "hold%' then 'hold' else 'active' end as state, 

DESCRIPTION 

from H 

D_TICKET_CHANGE 
    where HD_TICKET_ID = 7715 
    order by TIMESTAMP 

這裏是我的結果:

ID HD_TICKET_ID TIMESTAMP state DESCRIPTION 
25040 7715 "2014-08-06 16:39:29" active "Ticket Created 
25042 7715 "2014-08-06 17:13:15" active "Changed ticket Status from ""New"" to ""Opened"". 
25078 7715 "2014-08-07 10:38:28" hold "Changed ticket Status from ""Opened"" to ""Hold"". 
25081 7715 "2014-08-07 10:54:55" active "Changed assest name" 
25201 7715 "2014-08-11 08:24:56" active "Changed ticket Title. Changed ticket Status from ""Hold"" to ""Opened"". 
25202 7715 "2014-08-11 08:25:08" hold "Changed ticket Status from ""Opened"" to ""Hold"". 
25341 7715 "2014-08-13 10:56:00" active "Changed ticket Status from ""Hold"" to ""Opened"". 
25373 7715 "2014-08-13 13:41:01" hold "Changed ticket Status from ""Opened"" to ""Hold"". 
25551 7715 "2014-08-15 13:54:21" active "Added resolution text. Changed ticket Status from""Hold"" to ""Closed"". 

在這一點上,我卡住了。我將如何添加從1到3的時間,因爲票證處於活動狀態,需要報告時間,但是由於票證處於保留狀態,因此減去3到4,並基於活動狀態繼續進行這些結果的加法或減法vs持有?

+0

你想補充什麼?分鐘?天(有一小部分時間)? – Barranka 2014-08-28 19:19:03

+0

分鐘。只需尋找一些metrix即可向CIO提供關於平均機票關閉時間和暫停時間的信息。 – Jay 2014-08-28 19:51:18

回答

0

您需要獲取下一個時間戳值。然後你可以做你想要的聚合。我喜歡在MySQL中使用相關子查詢用於此目的:

select ID, HD_TICKET_ID, TIMESTAMP, 
     (case when DESCRIPTION LIKE '%opened" to "hold%' then 'hold' 
      else 'active' 
     end) as state, DESCRIPTION, 
     (select tc2.timestamp 
     from HD_TICKET_CHANGE tc2 
     where tc2.timestamp > tc.timestamp 
     order by tc2.timestamp 
     limit 1 
     ) as next_timestamp 
from HD_TICKET_CHANGE tc 
where HD_TICKET_ID = 7715 
order by TIMESTAMP; 

然後,你可以加起來的結果爲:

select sum((case when state = 'active' then 1 else -1 end) * 
      timestampdiff(second, next_timestamp, timestamp) 
     ) as TimeInSeconds 
from (select ID, HD_TICKET_ID, TIMESTAMP, 
      (case when DESCRIPTION LIKE '%opened" to "hold%' then 'hold' 
        else 'active' 
       end) as state, DESCRIPTION, 
      (select tc2.timestamp 
       from HD_TICKET_CHANGE tc2 
       where tc2.timestamp > tc.timestamp and tc2.HD_TICKET_ID = tc.HD_TICKET_ID 
       order by tc2.timestamp 
       limit 1 
      ) as next_timestamp 
     from HD_TICKET_CHANGE tc 
     where HD_TICKET_ID = 7715 
    ) t; 

這忽略了最後的時間標記,因爲沒有「下一個」值而你的問題並沒有具體說明在這種情況下要做什麼。

+0

這是基於ID拉下一個時間戳。第一個ID 25040用於該ticketID,但未列出的下一個時間戳25041用於另一個ticketID。我如何限制選中的下一個tampstamp僅用於相同的HD_TICKET_ID? – Jay 2014-08-28 19:35:07

+0

@Jay。 。 。條件'tc2.HD_TICKET_ID = tc.HD_TICKET_ID'應該這樣做。 – 2014-08-28 20:07:44