Finden Sie Ereignisse, die während eines bestimmten Zeitraums x-mal aufgetreten sind

8

Sagen wir, ich habe folgende Tabelle:

%Vor%

enthält ID des Objekts (nicht eindeutig, wiederholt sich) und Zeitstempel, wenn diese Objekt-ID beobachtet wurde.

Die Beobachtung läuft rund um die Uhr und fügt jedes Objekt-ID-Objekt mit dem aktuellen Zeitstempel ein.

Nun möchte ich eine Abfrage schreiben, um alle Objekt-IDs zu wählen, die mindestens 10 mal in einem 10-Minuten-Zeitraum gesehen wurden.

Es sollte wie Erkennung von Eindringen funktionieren.

Ein ähnlicher Algorithmus wird in demyhost-Skript verwendet, das nach ungültigen SSH-Logins sucht. Wenn konfigurierte Anzahl der Vorkommen während des konfigurierten Zeitraums gefunden wird, blockiert es IP.

Irgendwelche guten Vorschläge?

    
rkosegi 05.04.2012, 12:33
quelle

3 Antworten

4

Das sollte funktionieren:

%Vor%

Sie können @num_occurences und @num_occurences in Ihren Code verschieben und diese als Parameter Ihrer Anweisung festlegen. Abhängig von Ihrem Client können Sie auch die Initialisierung von @rownum_start und @rownum_end vor die Abfrage verschieben, was die Abfrageleistung verbessern könnte (Sie sollten das trotzdem testen, nur ein Bauchgefühl beim Erklären der beiden Versionen)

So funktioniert es:

Er wählt die gesamte Tabelle zweimal aus und verbindet jede Zeile von offset_start mit der Zeile in offset_end , die einen Offset von @num_occurences hat. (Dies geschieht mit den Variablen @rownum_* , um den Index jeder Zeile zu erstellen, wobei die Funktion row_number () simuliert wird, die von anderen rdbms bekannt ist.) Dann prüft es nur, ob sich die beiden Zeilen auf dieselbe object_id beziehen und die Periodenanforderungen erfüllen.
Da dies für jede Vorkommenszeile gemacht wird, würde die object_id mehrmals zurückgegeben werden, wenn die Anzahl der Vorkommen tatsächlich größer ist als @max_occurences , so dass sie am Ende gruppiert ist, um das zurückgegebene object_id s eindeutig zu machen

    
ddelbondio 17.04.2012, 10:10
quelle
1

Sie könnten es versuchen

%Vor%

Ich verstehe nicht, warum Sie int(10) für seen_timestamp verwenden: Sie könnten ein datetime ...

verwenden     
Marco 05.04.2012 12:37
quelle
1

Sie könnten folgende Anweisungen verwenden:

%Vor%

Es ist nicht sehr schnell und nicht sehr sauber, lassen Sie mich wissen, wenn jemand eine bessere Lösung findet!

    
Argeman 17.04.2012 10:45
quelle

Tags und Links