2015-11-19 80 views
0

我有一个Windows事件日志导入到一个表中。该日志包含每个Web服务器请求和具有日期时间戳的响应的记录。通常,请求和响应记录彼此相邻,但偶尔会有2个请求,然后是2个响应。我想要一个查询来计算平均响应时间,即响应日期时间 - 请求日期时间。TSQL - 比较相邻行

sample table data

+0

响应'ID'总是比相应的请求'ID'多一个吗?你有没有试图帮助我们? – HABO

+1

sql-server2008或sql-sever2012?由于LEAD/TRAILING,这是几次与疯狂相关的情况之一。 –

+0

的SQL Server 2014 – goyo

回答

1

假设请求和响应将永远是彼此相邻,得到的答复,并加入到基于ID的请求+ 1:

SELECT l.ID, l.[date and time] AS [Response Date], l2.[date and time] AS [Request Date], DATEDIFF([date and time],l2.[date and time]) AS [Time] FROM logs AS l 
JOIN logs AS l2 ON l.ID=l2.ID+1 
WHERE l.request=0 AND l2.request=1 
+0

啊这是伟大的,谢谢你,如何处理这种情况的任何想法哪里有2个请求,然后2个响应?我试图找出如何以某种方式第一次“配对”请求与响应,然后做这样的事情 – goyo

+0

也许在名为response_id的表中添加另一列,然后为该表创建一个触发器并让它的response_id等于last请求ID。 –

1

这只是一个评论太长时间才能适合它放置。

如果有送花儿给人在一段时间的请求,你可以很容易通过数字汇总所有请求次数,所有响应时间相加,只是减去第二ANS将第一计算时间的算术平均来响应的响应的请求(或响应)。

,因为既然你希望所有你不需要配对响应和请求的平均时间是可能的。

实施例:

T0 - Tf 
-- -- 
1 - 11 
2 - 12 
3 - 13 

T0和TF之间上述平均差异是相同的下面

T0 - Tf 
-- -- 
2 - 11 
1 - 12 
3 - 13 

所以下面的伪代码将工作

select 
(
    (
     sum([date and time]) 
     from [Mytable] 
     where is response 
    ) 
    - 
    (
     sum([date and time]) 
     from [Mytable] 
     where is request 
    ) 
) 
/
(
    count (rows) 
    from [Mytable] 
    where is request 
) 

当然您可以希望删除重复项。 这可以很简单,因为如果所有重复请求都获得重复响应,请选择不同的[日期和时间]。 amore复杂的情况下,你可以使用行号来获得第一次发生。

无论如何,只是总结整个批处理算术中位数的窍门。

+0

是的,这是一个好主意,但是对于我的需求,当我需要按周,小时,分钟等方式开始切片和划片响应时间时,它会变得非常复杂。感谢您花时间回复,非常OTB的解决方案 – goyo