2009-04-22 30 views
0

我有一個表,其中包含用於更改維護服務狀態的事件。這是數據的一個樣本:基於事件表的計算設置,除了事件

id date event 
234 2009-04-22 10:00:00 Service Request 
234 2009-04-22 10:02:00 Service Approbation 
234 2009-04-22 10:03:00 Service Asignation 
234 2009-04-22 10:40:00 Service Fulfilled 
... 

在一份報告中,我需要花費展現在每個項目上

id time 
234 40 minutes 
235 37 minutes 
... 

基本上時候,我正在做一個DATEDIFF這樣的:

SELECT ... 
, DATEDIFF(SECOND, 
(SELECT TOP 1 date FROM event_table ev WHERE ev.item = itm.id AND event = 1 ORDER BY date), 
(SELECT TOP 1 date FROM event_table ev WHERE ev.item = itm.id AND event = 4 ORDER BY date DESC) 
     ), ... 
FROM item_table itm 
WHERE ... 

現在我必須實現一個新的狀態。延遲和重新激活服務,但在計算花費在該服務上的時間總量時,不會考慮這些時間。

id date event 
234 2009-04-22 10:00:00 Service Request 
234 2009-04-22 10:02:00 Service Approbation 
234 2009-04-22 10:03:00 Service Asignation 
234 2009-04-22 10:07:00 Service Delayed   -- new state 
234 2009-04-22 10:37:00 Service Reactivated  -- new state 
234 2009-04-22 10:40:00 Service Fulfilled 
... 

報告

id time 
234 10 minutes -- Substract 30 minutes between Delay and Reactivation 
235 26 minutes 
... 

延遲和激活能爲任何項目進行不同的時間。

我知道我可以用光標做到這一點,但對我來說似乎很難受,有什麼方法可以在基於集合的方法上進行計算嗎?

回答

1

我會做到這一點是先找到整個工作的持續時間,減去所有延遲的持續時間的方式......

代碼找到拖延的時間:

SELECT 
    [delay_start].event_id, 
    SUM(DATEDIFF(second, [delay_start].date, [delay_finish].date)) 
FROM 
    event_table AS [delay_start] 
INNER JOIN 
    event_table AS [delay_finish] 
     ON [delay_finish].event_id = [delay_start].event_id 
     AND [delay_finish].date = (
           SELECT 
            MIN(date) 
           FROM 
            event_table 
           WHERE 
            event_id = [delay_start].event_id 
            AND date > [delay_start].date 
            AND event = 'Service Reactivated' 
           ) 
WHERE 
    [delay_start].event = 'Service Delayed' 
    AND [delay_finish].event = 'Service Reactivated' 
GROUP BY 
    [delay_start].event_id 

編輯:幾個錯別字糾正...

+0

這似乎是你最後一版的工作,我要檢查,謝謝 – 2009-04-22 16:03:16