λ 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.
试运行下面的代码。该代码对来自每个 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)