代码之家  ›  专栏  ›  技术社区  ›  λ Jonas Gorauskas

使用Web服务器日志中的数据时出现SQL Server日期范围问题

  •  8
  • λ Jonas Gorauskas  · 技术社区  · 14 年前

    我一直在使用 日志分析器工具已经有几个月了。这样做是为了使 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
    

    通过查看上面的数据,我可以很容易地看出 10.1.1.100 知识产权 地址访问了网站两次,每次访问有5次点击。但是,我是 不知如何用SQL代码来表达。有没有一种简单的分组方法 并按IP地址计算这些日期范围?

    我知道这些信息可以通过使用诸如 AWStats,但是我没有足够的能力在 我们使用的系统。

    2 回复  |  直到 14 年前
        1
  •  4
  •   RC_Cleland    14 年前

    试运行下面的代码。代码对每个IP地址的访问进行分组和编号。然后,它将查看与“阈值”值相比“uritem”命中的次数。我在一个名为“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 
    

    我对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
    
        2
  •  0
  •   Zachary    14 年前

    我认为最好的方法是先汇总数据,然后生成报告。

    我会这样做的。

    1. 创建包含所需事实的摘要表(例如UserIP、SessionStart、SessionEnd、PageViews)

    2. 弄清楚您认为是什么样的新访问(例如,我认为I is默认会话超时是20分钟,因此20分钟后任何连续被IP击中的情况,我都会考虑新访问)

    3. 创建光标以根据规则计算汇总数据。

      -- Summary Data
      DECLARE @UserIP AS VARCHAR(15)
      DECLARE @SessionStart AS DateTime
      DECLARE @SessionEnd AS DateTime
      DECLARE @PageViews AS INT
      
      
      -- Current Values
      DECLARE @ThisUserIP AS VARCHAR(15)
      DECLARE @ThisVisitTime AS DateTime
      DECLARE @ThisPage AS VARCHAR(100)
      
      
      -- Declare Cusrsor
      DECLARE StatCursor CURSOR FAST_FORWARD FOR
      -- Query, make sure you sort by IP/Date so their data is in cronological order
      SELECT IPAddress, RequestDateTime, UriStem
      FROM Stats
      ORDER BY IPAddress, RequestDateTime
      
      
      OPEN StatCursor
      FETCH NEXT FROM StatCursor
      INTO @ThisUserIP, @ThisVisitTime, @ThisPage
      
      
      -- Start New Summary
      SELECT @UserIP = @ThisUserIP, @SessionStart = @ThisVisitTime, @SessionEnd = @ThisVisitTime, @PageViews = 1
      
      
      FETCH NEXT FROM StatCursor
      INTO @ThisUserIP, @ThisVisitTime, @ThisPage
      
      
      WHILE @@FETCH_STATUS = 0
      BEGIN
      
      
      
      -- Check rule
      IF @UserIP = @ThisUserIP AND @ThisVisitTime &lt;= DATEADD(MI,30,@SessionEnd)
          BEGIN
              -- Same User and Session / Add to Summary
              SELECT @PageViews = @PageViews + 1, @SessionEnd = @ThisVisitTime
          END
      ELSE
          BEGIN
              -- Different User or New User / Write Current Summary and Start New Summary
              INSERT INTO StatSummary (UserIP, SessionStart, SessionEnd, PageViews) VALUES (@UserIP, @SessionStart, @SessionEnd, @PageViews)
              SELECT @UserIP = @ThisUserIP, @SessionStart = @ThisVisitTime, @SessionEnd = @ThisVisitTime, @PageViews = 1
          END
      
      
      FETCH NEXT FROM StatCursor
      INTO @ThisUserIP, @ThisVisitTime, @ThisPage
      
      END CLOSE StatCursor DEALLOCATE StatCursor
    4. 创建一个查询以获取所需的数据,例如(IP的所有时间命中率)。

      选择UserIP,COUNT(UserIP)FROM StatSummary GROUP BY UserIP