我正在查看流量日志(通过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组合。我希望能够返回用户列表,以及特定日期的会话数。
答案 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