Sql 基于集合的事件表计算,事件除外

Sql 基于集合的事件表计算,事件除外,sql,sql-server,tsql,sql-server-2000,set-based,Sql,Sql Server,Tsql,Sql Server 2000,Set Based,我有一个表,其中包含更改维护服务状态的事件。这是一个数据示例: 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

我有一个表,其中包含更改维护服务状态的事件。这是一个数据示例:

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
...
对于任何项目,延迟和重新激活可能会发生不同的时间


我知道我可以用光标来做这件事,但对我来说这似乎有点不对劲,有没有办法用基于集合的方法来计算呢?

我要做的方法是首先找到整个作业的持续时间,减去所有延迟的持续时间

查找延迟持续时间的代码:

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

编辑:更正了几个拼写错误…

看来您的上一个版本有效,我要检查一下,感谢您将event\u id更改为[delay\u start]。子查询中的项