首先,你的要求可以解释的方法不止一种,所以让我统计我认为你是想......我想你说当一个给定的IP地址有30分钟的会议结束闲置。所以如果一个IP地址每分钟打一个站点2个小时,然后需要30分钟的休息时间来代表一个会话。假设这是你想要的...
你可以使用LEAD和LAG来帮助识别会话。我的测试数据由Id列,IPAddress列和Created列组成。下面是代码,解释如下...
WITH t1 AS
(
SELECT
*
, DATEDIFF(minute, LAG(Created, 1, 0) OVER (PARTITION BY IPAddress ORDER BY Created), [Created]) AS SinceLastAccess
FROM
IISLog
), sessionStarts AS
(
SELECT
*
FROM
t1
WHERE
SinceLastAccess >= 30
), sessionInfo AS
(
SELECT
IPAddress
, Created AS SessionStart
, LEAD(Created, 1, '2025-01-01') OVER (PARTITION BY IPAddress ORDER BY CREATED) AS SessionEnd
FROM
sessionStarts
)
SELECT * FROM sessionInfo
第一CTE(T1)选择数据,但增加了一个称为SinceLastAccess
柱。这个新列使用LAG函数来查看上一行中的值并计算已经过了多少分钟。 PARTITION BY
将此计算限制为每个IP地址。
第二个CTE(sessionStarts)只是简单地从t1中选择那些行,其中SinceLastAccess
值大于30.这有效地告诉我们每个会话的开始。
最后,`sessionInfo'CTE建立在第二个基础上。使用LEAD功能,我们期待看到下一个会话的开始。该值取当前行的会话结束时的值。我们最终得到的是IP地址,会话开始和会话结束。现在你已经拥有这些了,应该很容易将它加入到原始表格中并对其进行分组。
你想要的输出是什么? – sgeddes 2013-05-02 23:50:42
@sgeddes想象一下由blob中的任何一行定义的行的“blob”与每个其他行相距超过30分钟。他希望每个IP地址和用户名的所有这些“斑点”都是分组行。 – Patashu 2013-05-02 23:54:56
问题是,您需要将时间限制在30分钟的区块中,并将它们按IP和TimeChunk分组。你不能只说“彼此30分钟内”,因为如果记录分散超过30分钟,它将不知道如何分组。 – 2013-05-03 00:04:21