从相关表中选择特定事件类型的最近事件日期

时间:2013-11-28 13:13:50

标签: sql sql-server sql-server-2005

我有两个表,Case和CaseEvents。

事件基本上是用户更新案例,并且有许多不同类型的事件。

我有一个KPI,两个这些事件(不同类型)必须在3分钟内完成 - 响应时间

响应时间是通过从EventTypeRef 2 OR EventTypeRef 3中的日期减去EventTypeRef 1中的日期来计算的。

我将所需的结果包含在下表中。

道歉,如果这很简单,我是一个正确的新手,在网上找不到类似的东西(虽然我的搜索中可能使用了错误的术语)。谢谢你的帮助。

我正在使用SQL Server 2005


'Case table'
----------

CaseRef  | CaseNo  
   1     |  1001
   2     |  1002


CaseEvents table
----------------

 CaseRef |          EventType            |     EventStartDate    | EventTypeRef
    1    |        'LTE Detected'         |  01/11/2013 09:05:36  |       1
    1    |       'Ambulance called'      |  01/11/2013 09:06:27  |       2
    2    |       'LTE Detected'          |  02/11/2013 09:11:22  |       1
    2    | 'Patient will call ambulance' |  02/11/2013 09:13:01  |       3
    1    |        'Case updated'         |  01/11/2013 09:09:34  |       4
    1    |     'Case marked complete'    |  01/11/2013 09:13:34  |       5


Desired result
--------------

CaseNo    |     LTEDetected      |      'LTE Acted On'   | 'Response time' |
   1      | 01/11/2013 09:05:36  |  01/11/2013 09:06:27  |     00:00:51    |  
   2      | 02/11/2013 09:11:22  |  02/11/2013 09:13:01  |     00:01:39    |  

2 个答案:

答案 0 :(得分:0)

您可以在聚合中添加CASE语句,因此您只需检查您感兴趣的事件类型。

SELECT  c.CaseNo,
        LTEDetected = MIN(CASE WHEN ce.EventTypeRef = 1 THEN ce.EventStartDate END),
        LTEActedOn = MIN(CASE WHEN ce.EventTypeRef IN (2, 3) THEN ce.EventStartDate END),
        Responsetime = DATEDIFF(SECOND, 
                                MIN(CASE WHEN ce.EventTypeRef = 1 THEN ce.EventStartDate END), 
                                MIN(CASE WHEN ce.EventTypeRef IN (2, 3) THEN ce.EventStartDate END)
                            )
FROM    Case c
        INNER JOIN CaseEvents ce
            ON c.CaseRef = ce.CaseRef
GROUP BY c.CaseNo;

<强> Example on SQL Fiddle

答案 1 :(得分:0)

select  CaseRef
,       datediff(second, StartDt, EndDt) as ResponseTime
from    (
        select  CaseRef
        ,       max(case when EventTypeRef = 1 then EventStartDate end) as StartDt
        ,       min(case when EventTypeRef in (2,3) then EventStartDate end) as EndDt
        from    CaseEvents
        group by
                CaseRef
        ) as SubQueryAlias