dedlfix: Ähnliche Einträge filtern

Beitrag lesen

Hi!

In der Ausgabe sollen nun Einträge bei denen sich die Uhrzeit um maximal 10 Sekunden unterscheiden, nur einfach angezeigt werden.

Das wird nicht einfach. Es gibt beim Filtern mit WHERE keinen Bezug auf einen Vorgänger oder Nachfolger. Und das schon deshalb nicht, weil die Sortierung erst später stattfindet. Um also zwei Datensätze zu vergleichen, muss man joinen. Das müsste jedoch in deinem Fall um einen Datensatz versetzt stattfinden. Da die Menge jedoch unsortiert ist und vermutlich keinen fortlaufenden, garantiert lückenlosen Zähler besitzt, kannst du nicht x mit x+1 joinen sondern müsstest auf größer oder kleiner als setzen und dann aber auf 1 limitieren, was gleich gar icht beim Joinen geht. Vielleicht übersehe ich auch etwas, aber eine einfache Lösung wirst du auf diese Weise nicht hinbekommen, denke ich.

Du könntest nun im abfragenden Programm ein Array aufbauen. Der erste Datensatz wird abgelegt. Wenn der nächste kleiner als 10 Sekunden entfernt ist, wird der vorhergehende überschrieben, ansonsten wird es hinten drangehängt.

Wenn die Abfrage schon im DBMS passieren soll, weil die Datenmenge wegen der doppelten Datensätze zu groß zum Übertragen wird, dann würde ich eine Stored Procedure schreiben. Allerdings braucht die zum Arbeiten auch temporären Speicher, was für den Server vielleicht zu einem Problem werden kann. Jedenfalls braucht es eine temporäre Tabelle, die das Ergebnis sammelt. Es gibt leider kein Array-Konstrukt oder etwas anderes, um einen Datensatz zwischenzuspeichern, außer einer weiteren temporären Tabelle. Benötigt wird jedoch ein Zwischenspeicher für einen Datensatz, weil der erst dann zur Ergebnis-Temp-Tabelle hinzugefügt werden kann, wenn eine genügend hohe Differenz zum nachfolgenden Datensatz festgestellt wurde. Ansonsten muss der Nachfolger in den Zwischenspeicher. Der Zwischenspeicher müsste also eine Handvoll Variablen sein oder bei größeren Mengen eben eine weiter temp. Tabelle. Bleibt nun noch, wie man sich durch die eigentliche Datenmenge bewegt: dazu kannst du dir einen so genannten Cursor erstellen. Der bekommt ein Select-Statement übergeben, welches die Daten aus deiner Tabelle mit allen weiteren gewünschten Bedingungen und in einer definierten Reihenfolgen zieht. Am Ende wird die temporäre Ergebnis-Tabelle mit einem normalen SELECT ausgegeben und erzeugt so die Ergebnismenge der Stored Procedure, die im abfragenden Programm wie bei einem einfachen SELECT behandelt wird.

Nochmal zusammenfassend den Inhalt der Stored Procedure:

  • Temporäre Tabelle für das Ergebnis erstellen
  • Variablen oder weitere temporäre Tabelle für den Datensatzzwischenspeicher
  • Cursor für die Abfrage
  • Schleife
    -- vom Cursor einen Datensatz holen
    -- mit dem Zwischenspeicher vergleichen
    -- ggf. Zwischenspeicher ans Ergebnis hängen
    -- aktuellen Datensatz in Zwischenspeicher legen
  • Temporäre Tabelle für das Ergebnis ausgeben

Die Syntax für die Elemente der Stored Procedure gibts im Kapitel SQL Statement Syntax.

Lo!