2009-04-22 4 views
0

Ich habe eine Tabelle, die Ereignisse enthält, um den Status eines Wartungsdienstes zu ändern. Dies ist ein Beispiel von Daten:Set-basierte Berechnung für Ereignistabelle mit Ausnahme eines Ereignisses

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 
... 

In einem Bericht, ich muss für jedes Element

id time 
234 40 minutes 
235 37 minutes 
... 

Grundsätzlich verbrachte Zeit zeigen, ich mache ein DATEDIFF wie folgt aus:

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 ... 

Jetzt muss ich einen neuen Zustand implementieren. Verzögerung und Reaktivierung eines Dienstes, aber diese Zeit muss bei der Berechnung der gesamten für diesen Dienst aufgewendeten Zeit nicht berücksichtigt werden.

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 
... 

Bericht

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

Die Verzögerung und die Reaktivierung können verschiedene Zeiten für jedes Element auftreten.

Ich weiß, dass ich dies mit einem Cursor tun kann, aber es scheint Hacky für mich, gibt es eine Möglichkeit, dies auf einem Set-basierten Ansatz zu berechnen?

Antwort

1

So wie ich das tun würde, ist es, zunächst die Dauer des gesamten Jobs zu finden, subtrahieren die die Dauer aller Verzögerungen ...

-Code die Dauer der Verzögerungen zu finden:

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 

EDIT: Ein paar Tippfehler korrigiert ...

+0

Es scheint, als ob Ihre letzte Ausgabe funktioniert, ich werde überprüfen, danke –

+0

Arbeitete Änderung ereignis_id zu [delay_start] .item auf Unterabfrage –

Verwandte Themen