Logdaten ausdünnen

Antwort erstellen

Smilies
:D :) :( :o :shock: :? 8-) :lol: :x :P :razz: :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: :badgrin: :doubt:
BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet
Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Logdaten ausdünnen

Re: Logdaten ausdünnen

Beitrag von Dieterlem » 17. Mär 2019, 12:00

Vielen dank für die Unterstützung,

liege seit gestern mit Fieber im Bett. daher wird es noch ein wenig dauern, bis ich ein richtiges Feedback geben kann.
ich schau es mir an sobald ich wieder fit bin.

Gruß
Dieterlem

Re: Logdaten ausdünnen

Beitrag von mmarkus » 17. Mär 2019, 06:22

Eventuell noch ein simpler Vorschlag:

Das Konzept - es wird für jede Stunde der erste Datensatz gesucht und der Rest gelöscht.
Da du eh tageweise speicherst, brauchst du keine Einschränkung bezüglich des Start Zeitpunkts.
Die Abfrage einfach mit dem jeweiligen Tabellennamen zusammenpicken.
Datumfunktionen würde ich meiden - sind bei VBA recht langsam.

Noch der Hinweis: Access ist bei Delete und Update etwas unfähig.
Ansonsten könnte man das ja per Left Join lösen:

Code: Alles auswählen
DELETE
FROM
   Tabelle
WHERE
   ID Not IN
   (
      SELECT
         Min(X.ID) AS MinID
      FROM
         Tabelle X
      Group By
         Int(X.log_time * 24)
   )


Das gleiche, aber auch Sicher der Performance bei Access besser:

Code: Alles auswählen
DELETE
   *
FROM
   Tabelle
WHERE
   ID IN
   (
      SELECT
         T.ID
      FROM
         Tabelle T
         LEFT JOIN
            (
               SELECT
                  Min(ID) AS MinID
               FROM
                  Tabelle
               Group By
                  Int(Zeitpunkt*24)
            )
            X
            ON T.ID = X.MinID
      WHERE
         X.MinID Is Null
   )
;

Re: Logdaten ausdünnen

Beitrag von Gast » 17. Mär 2019, 02:11

langsam verstehe ich es besser...

In diesem Sinne: Es ist wenig verständlich, warum man Log-Daten in verschiedene Tabellen hinterlegt - es sei denn, man kann glänzend damit umgehen.

In meinem beschränkten progammiertechnischen Horizont bzw. einfach der Einfachheit halber würde ich auf eine Tabelle orientieren und dann so etwas anwenden können:
Code: Alles auswählen
DELETE
FROM
   logTabelleGesamt
WHERE
   log_time < DateAdd("yyyy", - 1, log_time)
      OR
   (
      log_time < DateAdd("d", - 1, log_time)
         AND
      log_time <>
         (
            SELECT
               MAX(log_time)
            FROM
               logTabelleGesamt
            WHERE
               log_time < dateAdd("d", - 1, log_time)
            GROUP BY
               DateValue(log_time) + Hour(log_time) / 100
         )
      )

Re: Logdaten ausdünnen

Beitrag von mmarkus » 16. Mär 2019, 20:50

Und gibts noch Fragen?

So wie das aussieht ist das Fitness Center für Recher.
Schleifen drehen bis zum Umfallen, statt einer simplen Löschabfrage.
Hast du noch nie Abfragen geschrieben, oder wie kommt man auf so einen Code?

Re: Logdaten ausdünnen

Beitrag von Dieterlem » 16. Mär 2019, 19:28

Hier mein Ansatz:

Code: Alles auswählen
Sub LogClean()
Dim rcsLog As DAO.Recordset
Dim td As DAO.TableDef
Dim datLetzter As Date


For Each td In CurrentDb().TableDefs
    If Left(td.Name, 4) = "log_" Then
    Set rcsLog = CurrentDb.OpenRecordset(td.Name)
    rcsLog.MoveLast
    datLetzter = rcsLog!log_time
    Debug.Print datLetzter
   
    Do While Not rcsLog.BOF
        If DateDiff("h", rcsLog!log_time, datLetzter) >= 24 Then GoTo AELTERE_EINTRAEGE
        rcsLog.MovePrevious
    Loop
   
AELTERE_EINTRAEGE:
 
    datMerker = rcsLog!log_time
   
    Do While Not rcsLog.BOF
        If DateDiff("n", rcsLog!log_time, datMerker) >= 10 And _
           DateDiff("n", rcsLog!log_time, datMerker) <= 60 Then
        rcsLog.Edit
        rcsLog.Delete
        rcsLog.Update
        datMerker = rcsLog!log_time
    Loop
   
    'alles aelter als ein jahr loeschen
   
    End If
Next td

End Sub

Re: Logdaten ausdünnen

Beitrag von mmarkus » 16. Mär 2019, 18:52

Vielleicht überlegst du dir erst mal die Logik - die ist ja unabhängig von der Programmierung.

Wenn es dann bei der Umsetzung der Programmierung nicht klappt, dann kannst du ja konkret fragen.

Logdaten ausdünnen

Beitrag von Dieterlem » 16. Mär 2019, 18:40

Hallo Access-Freunde.

Ich habe eine Datenbank die Log-daten von einem System speichert. Die Werte werden alle 10 Minuten in die Tabellen geschrieben. Dieser Intervall ist auch für die Auswertung am aktuellen Tag sinnvoll. Jedoch ältere Werte (>24 Stunden) müssen nicht so Zeitgenau sein. Daher würde ich gerne die LogTabellen ausdünnen. Nach 24 Stunden reicht es wenn nur noch ein Eintrag pro Stunde vorhanden ist.


Alle Tabellen haben die gleiche Struktur:
Tabellenname: log_Xxxxxx
ID: log_ID (Integer)
Zeit: log_time (Date)
Wert: log_wert (Text)

Wie bekommen ich eine Prozedur hin, die die neuesten Einträge (letzten 24 Stunden) ignoriert und alle anderern so löscht, dass nur noch ein Eintrag pro Stunde vorhanden bleibt?
Da es manchmal zu Systemausfällen kommt, kann es sein, dass über eine bestimmte Zeit keine Datensätze gibt.

Zudem möchte ich alle Einträge älter als ein Jahr löschen.


Gruß
Marcus

Nach oben