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

遅延と再アクティブ化は、どのアイテムでもさまざまな時点で発生する可能性があります。

カーソルでこれを実行できることは知っていますが、私にはハッキーに思えます。セットベースのアプローチでこれを計算する方法はありますか?

4

1 に答える 1

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

編集:いくつかのタイプミスが修正されました...

于 2009-04-22T15:47:28.830 に答える