2010-05-10 18 views
3

J'ai ci-dessous hits diagraphie de table click_log pour certains urlsSQL SELECT avec plage horaire

site ip ua direction hit_time 
----------------------------------------------------- 
1  127.0.0.1  1   20010/01/01 00:00:00 

2  127.0.0.1  1   20010/01/01 00:01:00 

3  127.0.0.1  0   20010/01/01 00:10:00 

.... ......... 

Je veux sélectionner coups entrants (direction: 1) et le groupe par les sites qui sont:

  • de même ip et navigateur
  • connecté dans les 10 minutes de l'autre
  • est survenue plus de 4 fois en 10 minutes.

Je ne suis pas sûr si ci-dessus était assez clair. L'anglais n'est pas ma langue maternelle. Laissez-moi essayer d'expliquer avec un exemple.

Si le site 1 obtient 5 accès de la même adresse IP et du même navigateur avec dans 10 minutes après avoir reçu le premier hit unique de cette adresse IP et du navigateur, je veux qu'il soit inclus dans la sélection.

Fondamentalement, j'essaie de trouver des abuseurs.

+0

quelle version sql exécutez-vous? –

+0

Microsoft SQL Server 2008 – nLL

Répondre

2

Je pense que cela fait ce que vous avez besoin. J'ai inclus quelques exemples de données aussi.

Create Table #t 
(
[Site] int, 
IP varchar(20), 
Direction int, 
Hit_Time datetime 
) 

Insert Into #t 
Values (1,'127.0.0.1',1,'2010-01-01 00:00:00') 

Insert Into #t 
Values (1,'127.0.0.1',1,'2010-01-01 00:01:00') 

Insert Into #t 
Values (1,'127.0.0.1',1,'2010-01-01 00:03:00') 

Insert Into #t 
Values (1,'127.0.0.1',1,'2010-01-01 00:04:00') 


Insert Into #t 
Values (2,'127.0.0.2',1,'2010-01-01 00:00:00') 

Insert Into #t 
Values (2,'127.0.0.2',1,'2010-01-01 00:01:00') 

Insert Into #t 
Values (2,'127.0.0.2',0,'2010-01-01 00:03:00') 

Insert Into #t 
Values (2,'127.0.0.2',1,'2010-01-01 00:04:00') 


Select Distinct Site 
From #t 
Where Direction = 1 
Group by Site, IP 
Having (DateDiff(minute,Min(HIt_Time), max(hit_time)) <= 10) And Count(*) >= 4 

Drop Table #t 
+0

Merci, cela semble ok mais il grupus par site et ip de sorte que vous obtenez le site listé plus d'une fois. à part ça, ça a l'air très bien – nLL

+0

Ah je n'étais pas sûr si vous aviez besoin du site aussi. Vous supprimez simplement Site des clauses Select & Group By pour résoudre ce problème. – codingbadger

+0

Non, j'ai seulement besoin du site énuméré, fondamentalement j'ai besoin de trouver des sites qui ont abusé afin que je puisse entrer dans les détails.Lorsque je supprime ip de select et gorup par résultats, j'obtiens aussi des hits simples. – nLL

0

Qu'en est-

SELECT IP, (SELECT COUNT(*) FROM Click_Log WHERE Click_Log.IP = CL.IP 
    AND DIRECTION = 1 AND DATEDIFF(MINUTE, ClickLog.HIT_TIME, CL.HIT_TIME) 
    BETWEEN -10 AND 10) AS CLICK_COUNT 
FROM Click_Log CL 
WHERE DIRECTION = 1 AND CLICK_COUNT > 4 
0
;WITH rankings AS (
    SELECT *, DENSE_RANK() OVER(ORDER BY [site], ip, ua) groupId, 
     ROW_NUMBER() OVER(PARTITION BY [site], ip, ua ORDER BY hit_time) sequence 
    FROM Hits 
    WHERE direction = 1), 
periods AS (
    SELECT r.groupId, r.sequence, count(*) hitCount 
    FROM rankings r 
    LEFT OUTER JOIN rankings r2 
     ON r2.groupId = r.groupId and r2.sequence < r.sequence 
     AND r2.hit_time >= DATEADD(second, -10*60, r.hit_time) 
     AND r2.hit_time < r.hit_time 
    GROUP BY r.groupId, r.sequence 
), 
groups AS (
    SELECT p.groupId, MAX(p.hitCount) maxHitCount 
    FROM periods p 
    GROUP BY p.groupId 
) 
SELECT DISTINCT r.[site], r.ip, r.ua, g.maxHitCount 
FROM rankings r 
INNER JOIN groups g ON g.groupId = r.groupId 
WHERE maxHitCount >= 5 
ORDER BY maxHitCount DESC 
0

J'ai ajouté cette réponse en réponse au commentaire OP.

Je l'ai utilisé les données de test suivant:

Create Table dbo.Temp 
(
[Site] int, 
IP varchar(20), 
Direction int, 
Hit_Time datetime 
) 

Insert Into dbo.Temp 
Values (1,'127.0.0.1',1,'2010-01-01 00:00:00') 

Insert Into dbo.Temp 
Values (1,'127.0.0.1',1,'2010-01-01 00:01:00') 

Insert Into dbo.Temp 
Values (1,'127.0.0.1',1,'2010-01-01 00:03:00') 

Insert Into dbo.Temp 
Values (1,'127.0.0.1',1,'2010-01-01 00:04:00') 


Insert Into dbo.Temp 
Values (2,'127.0.0.2',1,'2010-01-01 15:00:00') 

Insert Into dbo.Temp 
Values (2,'127.0.0.2',1,'2010-01-01 15:31:00') 

Insert Into dbo.Temp 
Values (2,'127.0.0.2',1,'2010-01-01 15:32:00') 

Insert Into dbo.Temp 
Values (2,'127.0.0.2',1,'2010-01-01 15:33:00') 

Insert Into dbo.Temp 
Values (2,'127.0.0.2',1,'2010-01-01 15:34:00') 

D'abord, vous devez créer une fonction pour faire le travail sur:

Create Function dbo.fn_CheckSuspectActivity (@Site int, @IP varchar(20), @MinDate datetime, 
                @MaxDate datetime, @Direction int, @Interval int, 
                @MaxCount int) 

                returns int 
     as begin 
     Declare @OrigMaxDate datetime, 
       @IsSuspect int 

     Set @OrigMaxDate = @MaxDate 
     Set @IsSuspect = 0 

     if (DATEDIFF(minute, @MinDate, @MaxDate) > 10) 
       --Min and Max dates for site & Ip 
       -- are more than 10 minutes apart 
       begin 
         --Loop through the records 
         While (@MaxDate <= @OrigMaxDate And @IsSuspect = 0) 
         begin 
           -- Set The MaxDate to the MinDate plus 10 mins 
           Set @MaxDate = DATEADD(Minute, 10, @MinDate) 

           If (Select COUNT(*) 
            From dbo.Temp 
            Where Site = @Site 
            And IP = @IP 
            And Hit_Time >= @MinDate 
            And Hit_Time <= @MaxDate 
            And Direction = @Direction 
            ) >= @MaxCount 

             Begin 
               -- Hit Count exceeded for the specified 10 min range 
               set @IsSuspect = 1 
             End 

            Else 

             Begin 
             -- Set the minDate to the maxDate 
             Set @MinDate = @MaxDate 
             --Add another 10 minutes on 
             Set @MaxDate = DATEADD(minute, 10,@MaxDate) 

             End 

         end 
         -- We've finished the loop but if @IsSuspect is still zero we need to do one final check 
         if (@IsSuspect = 0) 
          begin 
            -- Check the number of records based on the last MinDate used 
            -- and the original MaxDate 

            If (Select COUNT(*) 
            From dbo.Temp 
            Where Site = @Site 
            And IP = @IP 
            And Hit_Time >= @MinDate 
            And Hit_Time <= @OrigMaxDate 
            And Direction = @Direction 
            ) >= @MaxCount 
              begin 
                -- Hit Count exceeded for the specified 10 min range 
                set @IsSuspect = 1 
              end 
             else 
              begin 
                set @IsSuspect = 0 
              end 

          end 

       end 

      else 
       -- Time difference isn't more than 10 minutes so do a "normal" check 
       begin 

         If (Select COUNT(*) 
          From dbo.Temp 
          Where Site = @Site 
          And IP = @IP 
          And Hit_Time >= @MinDate 
          And Hit_Time <= @MaxDate 
          And Direction = @Direction) >= @MaxCount 

          BEGIN -- Its a suspect IP 
            Set @IsSuspect = 1 
          END 

           ELSE 

          BEGIN 
            -- It's ok 
            Set @IsSuspect = 0 
          END 

       end 


return @IsSuspect 

End 
Go 

Ensuite, cette instruction select devrait vous donner la bonne réponse :

With Qry as 
(

Select Site, 
     IP, 
     MIN(Hit_Time) as'MinTime', 
     MAX(Hit_TIme) as 'MaxTime' 

From dbo.Temp 
Group By Site, IP 
) 

Select Site 
From Qry 
Where dbo.fn_CheckSuspectActivity(Site, IP, MinTime, MaxTime, 1, 10, 4) = 1 
-- function params are as follows: Site Number, IP Address, FirstTimeLogged, 
--         LastTimeLogged, Direction, IntervalToCheck, MaxOccurences 

Si les première et dernière dates sont séparés d'au moins 10 minutes puis il vérifie i f ils ont dépassé le nombre de hits. Si la première date et la dernière date sont espacées de plus de 10 minutes, elle incrémente la première date par intervalles de 10 minutes et vérifie si elles ont dépassé le nombre de coups pendant cette période de 10 minutes.

J'espère que c'est ce dont vous avez besoin.

Barry