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?
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)
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