TSQL - 比较相邻的行

时间:2015-11-19 17:44:46

标签: sql-server tsql datetime

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

sample table data

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

它只是一个评论太长,无法正确放置。

如果总是在一段时间内对请求做出响应,您可以通过对所有请求时间求和来简单计算响应时间的算术中值,将所有响应时间相加并仅从第二个中除去第一个请求(或响应)的数量。

这是可能的,因为你想要平均所有时间,你不需要配对回复和请求。

示例:

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
)

当然,您可以删除重复项。 如果所有重复的请求都获得重复的响应,则可以选择不同的[日期和时间]。更复杂的情况是你可以使用行号来获得第一次发生。

无论如何,总结整批的诀窍是算术中位数。