Проблема с диапазоном дат SQL Server при использовании данных из журналов веб-сервера - PullRequest
8 голосов
/ 19 ноября 2010

Я импортировал мои необработанные файлы журнала IIS в таблицу SQL Server, используя Log Parser tool уже несколько месяцев. Это сделано, чтобы включить написание Отчеты 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 IP адрес посетил сайт дважды и имел 5 просмотров за каждое посещение. Тем не менее, я в недоумении относительно того, как выразить это в коде SQL. Есть ли простой способ группировки и посчитать эти диапазоны дат по IP-адресу?

Я понимаю, что эту информацию можно получить с помощью таких инструментов, как AWStats, но я не могу позволить себе установить Perl на системы, которые мы используем.

Ответы [ 2 ]

4 голосов
/ 19 ноября 2010

Дайте код ниже пробного запуска.Код группирует и нумерует посещения с каждого IP-адреса.Затем он смотрит, сколько хитов «уристем» по сравнению со значением «порога».Я протестировал код в таблице с именем «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
0 голосов
/ 19 ноября 2010

Я думаю, что лучший способ сделать это - сначала подвести итоги, а затем сгенерировать отчет.

Вот как я это сделаю.

  1. СоздатьSummaryTable с нужными вам фактами (например, UserIP, SessionStart, SessionEnd, PageViews)

  2. Определите, что вы считаете новым посещением (например, я думаю, что время ожидания сеанса IIS по умолчанию составляет 20 минут, поэтомупри каждом последующем попадании IP через 20 минут я буду считать новый визит.)

  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
    
    
    <pre><code>-- 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ЗАКРЫТЬ StatCursor DEALLOCATE StatCursor
  4. Создайте запрос для получения необходимых данных, например (все время хиты по IP).

    ВЫБЕРИТЕ UserIP, COUNT (UserIP) ИЗ StatSummary GROUP BY UserIP

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...