如何通过检测闲置或不活动的时段来识别流量日志中的会话?

时间:2015-06-03 00:34:19

标签: sql tsql sql-server-2012 haproxy

我正在查看流量日志(通过HAProxy收集)并尝试识别用户会话(即访问)。我将用户定义为唯一的IP +用户代理校验和,或者在可用的情况下,为登录用户定义用户ID。

我不完全是一个SQL wiz,我想知道是否有某种方法可以识别自上次记录事件发生30分钟后任何记录事件定义的新会话同一个用户。我们使用T-SQL,并且我们在SQL Server 2012上运行。

可能是因为我忽视了一些明显混淆了会话ID方法的东西。我很欣赏任何想到的智慧。

db架构看起来像这样,仅针对UA定义的用户进行过滤:abcdefghij + IP:11.11.11.1

Id   || User Agent ||     IP     || AccountID ||   RouteName   ||   CreationDate
-----------------------------------------------------------------------------------
9    || abcdefghij || 11.11.11.1 ||   NULL    ||     Home      || 2015-05-29 00:00:25
-----------------------------------------------------------------------------------
45   || abcdefghij || 11.11.11.1 ||   NULL    ||   Home/Photo  || 2015-05-29 00:00:26
-----------------------------------------------------------------------------------
55   || abcdefghij || 11.11.11.1 ||   NULL    ||   Home/Photo  || 2015-05-29 00:00:27
-----------------------------------------------------------------------------------
1125 || abcdefghij || 11.11.11.1 ||   NULL    ||     Home      || 2015-05-29 01:02:03

为了简单起见,我们假设每次新的一天(新表)开始时我们都会重启所有会话。因此,我们正在查看上面的两个会话 - 用户在白天的所有会话。

实际上,我们正在谈论成千上万的UA + IP组合。我希望能够返回用户列表,以及特定日期的会话数。

1 个答案:

答案 0 :(得分:3)

您可以通过创建由row_number()创建的行号的CTE,然后使用偏移量自行连接来计算后续行之间的差异。您的完整查询将如下所示:

with events as
(
select "User Agent", 
       ip as user,
       creationdate, 
       row_number() over (partition by "User Agent", ip order by creationdate) rn
       from SourceTable
)
select "User Agent", ip, count(*)
from 
events e1
join events e2 on e1.rn = e2.rn-1
where datediff(minute, e2.creationdate, e1.creationdate) >=30
group by "User Agent", ip