2013-07-15 51 views
2

我需要使用SQL实现一个非常复杂的函数,我无法弄清楚从哪里开始。SQL Server 2012:计算日志表中每条唯一记录的总时间

-------------------------------------------------------- 
Entity | Source |Destination | Time 
-------------------------------------------------------- 
E1  | - | T12  |2012-05-17 10:13:01.000 
E2  | - | T22  |2012-05-17 10:13:02.000 
E1  | T12 | T22  |2012-05-17 10:13:03.000 
E2  | T22 | T12  |2012-05-17 10:13:04.000 
E1  | T22 | T12  |2012-05-17 10:13:05.000 
E2  | T12 | T21  |2012-05-17 10:13:06.000 
E1  | T12 | T13  |2012-05-17 10:13:07.000 
E2  | T21 | T23  |2012-05-17 10:13:08.000 

--------------------------------------------------- 
Src/Dest | Type 
--------------------------------------------------- 
    T11 | T1 
    T12 | T1 
    T13 | T1 
    T21 | T2  
    T22 | T2 
    T23 | T2 
----------------------------------------------------- 

我需要计算每个实体在这两种类型中花费的总时间。

例如:

E1已经使用了2秒(13:01-13:03)在T12,2秒(13:03-13:05)在T22,2秒(13:05-13:07)在T12。所以,花在T1上的时间是4秒,花在T2上的时间是2秒

E2在T12,2秒(13:04-13:06)花了2秒(13:02-13:04) 2秒(13:06-13:08)在T21。所以,在T1中花费的时间是2秒,花在T2上的时间是4秒。

注:我不能做最大 - 最小时间;我需要继续积累时间,直到没有可用的记录。

SQL Server 2012中最简单的方法是什么?如果需要,我可以创建任何中间表。谢谢!

+0

所以它被认为是“在从被列为目的地的时间到它在源中列出的时间的类型中? –

+0

是的,那是对的。 – user1097128

回答

2

我相信这将工作:

SELECT Entity,Destination'Type',Time,SUM(TimeDiff) OVER (PARTITION BY Entity, Destination ORDER BY Time)'Running Total' 
FROM (SELECT Entity, LEFT(SOURCE,2)'Source',LEFT(Destination,2)'Destination',Time, DATEDIFF(second,LAG([Time]) OVER (PARTITION BY Entity ORDER BY [Time]),[time])'TimeDiff' 
     FROM #test 
    )sub 
ORDER BY TIME 

或者,如果你只是想为给定的实体/类型组合的总时间:

SELECT Entity, Type, MAX(Running_Total) 
FROM (SELECT Entity,Destination'Type',Time,SUM(TimeDiff) OVER (PARTITION BY Entity, Destination ORDER BY Time)'Running_Total' 
     FROM (SELECT Entity, LEFT(SOURCE,2)'Source',LEFT(Destination,2)'Destination',Time, DATEDIFF(second,LAG([Time]) OVER (PARTITION BY Entity ORDER BY [Time]),[time])'TimeDiff' 
       FROM Table1 
      )sub 
    )sub 
GROUP BY Entity, Type 
ORDER BY Entity, Type 

演示:SQL Fiddle

+0

非常感谢。我没有意识到滞后函数,我花了一些时间来弄清楚。但似乎它会起作用。再次感谢。 – user1097128