从Web服务器日志使用数据时SQL Server日期范围问题

λ J*_*kas 8 sql t-sql sql-server iis

我已经使用Log Parser工具将原始IIS日志文件导入SQL Server表几个月了.这样做是为了能够根据此日志数据写入SSRS报告.

我正在处理的其中一个报告应该确定每个唯一IP地址的访问次数.访问被定义为访问网站页面的IP地址,然后在一小时内再发出4个请求.所有5个请求都在一次访问网站内.当晚晚些时候,相同的IP地址访问该网站,但现在是3小时后,所以我们将这个新活动计入相同的IP作为新的访问.以下是数据示例:

IPAddress,   RequestDateTime,     UriStem
10.1.1.100,  2010-10-15 13:30:30, /
10.1.1.100,  2010-10-15 13:30:31, /style.css
10.1.1.100,  2010-10-15 13:30:31, /script.js
10.1.1.100,  2010-10-15 13:30:32, /funny.gif
10.1.1.100,  2010-10-15 13:30:33, /picture.jpg
10.1.1.101,  2010-10-15 13:40:50, /page2.html
10.1.1.101,  2010-10-15 13:40:51, /style.css
10.1.1.102,  2010-10-15 14:10:20, /page4.html
10.1.1.102,  2010-10-15 14:10:21, /style.css
10.1.1.100,  2010-10-15 16:55:10, /
10.1.1.100,  2010-10-15 16:55:11, /style.css
10.1.1.100,  2010-10-15 16:55:11, /script.js
10.1.1.100,  2010-10-15 16:55:12, /funny.gif
10.1.1.100,  2010-10-15 16:55:13, /picture.jpg
Run Code Online (Sandbox Code Playgroud)

通过查看上面的数据,我可以很容易地看出10.1.1.100IP地址已经访问过该网站两次,并且每次访问都有5次点击.但是,我不知道如何在SQL代码中表达它.有没有一种简单的方法可以按IP地址对这些日期范围进行分组和计数?

我知道可以使用AWStats等工具捕获这些信息,但我没有能力在我们使用的系统上安装Perl.

RC_*_*and 4

试运行下面的代码。该代码对来自每个 IP 地址的访问进行分组和编号。然后查看与“阈值”值相比有多少“uristem”命中。我在名为“Foo”的表上测试了代码,您需要在运行测试之前检查表和列名称。

DECLARE @threshold INT;  
SET @threshold = 4;  --this number should not include the initial visit
DECLARE @lookbackdays int; 
SET @lookbackdays = 300; 

;WITH postCTE as  
(  
SELECT   
    ipaddress,  
    uristem,  
    requestdatetime,  
    RowNumber = ROW_NUMBER() OVER (ORDER BY ipaddress,requestdatetime ASC)  
FROM  
    Foo  --put your table name here
WHERE  
    requestdatetime > GETDATE() - @lookbackdays 
)  
--select * from postCTE

SELECT   
    p1.ipaddress AS [ipaddress],   
    p2.RowNumber - p1.RowNumber +1 AS [Requests], 
    p1.requestdatetime AS [DateStart]
FROM  
    postCTE p1  
INNER JOIN  
    postCTE p2   
    ON p1.ipaddress = p2.ipaddress   
    AND p1.Rownumber = p2.RowNumber - (@threshold )  
WHERE  
    DATEDIFF(minute,p1.requestdatetime,p2.requestdatetime) <= 60 
Run Code Online (Sandbox Code Playgroud)

我对 SQL 2008 的测试输出是

ipaddress   Requests    DateStart
10.1.1.100  5   2010-10-15 13:30:30.000
10.1.1.100  5   2010-10-15 16:55:10.000
Run Code Online (Sandbox Code Playgroud)