Logdaten ausdünnen

Moderator: ModerationP

Logdaten ausdünnen

Beitragvon 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
langsam verstehe ich es besser...und doch bleiben noch soo viele Fragen.
Dieterlem
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 178
Registriert: 04. Mär 2007, 20:15
Wohnort: Pfalz

Re: Logdaten ausdünnen

Beitragvon 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.
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1636
Registriert: 16. Apr 2012, 16:07
Wohnort: Oberösterreich

Re: Logdaten ausdünnen

Beitragvon 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
langsam verstehe ich es besser...und doch bleiben noch soo viele Fragen.
Dieterlem
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 178
Registriert: 04. Mär 2007, 20:15
Wohnort: Pfalz

Re: Logdaten ausdünnen

Beitragvon 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?
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1636
Registriert: 16. Apr 2012, 16:07
Wohnort: Oberösterreich

Re: Logdaten ausdünnen

Beitragvon 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
         )
      )
Gast
 

Re: Logdaten ausdünnen

Beitragvon 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
   )
;
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1636
Registriert: 16. Apr 2012, 16:07
Wohnort: Oberösterreich

Re: Logdaten ausdünnen

Beitragvon 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
langsam verstehe ich es besser...und doch bleiben noch soo viele Fragen.
Dieterlem
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 178
Registriert: 04. Mär 2007, 20:15
Wohnort: Pfalz


Zurück zu Access Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste