Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Ereigniss, neue Tabelle mit Duchschnittswerten

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von SQL_Dummie, 27 Oktober 2015.

  1. SQL_Dummie

    SQL_Dummie Benutzer

    Hallo an alle SQL Gurus,
    brauche wieder mal eure Unterstützung.

    Ich habe ein Tabelle (My_RaspPI)
    Code:
    CREATE TABLE `My_RaspPI` (
        `timevalue` TIMESTAMP NULL DEFAULT NULL,
        `CPU_Temp` FLOAT NULL DEFAULT NULL
    )
    mit folgen dem Inhalt:
    Code:
    timevalue                   | CPU_Temp
    ----------------------------|-----------------------
    2015-10-24 05:40:00            32,63
    2015-10-24 05:41:00            32,65
    2015-10-24 05:42:00            32,69
    2015-10-24 05:43:00            32,74
    ...
    ...
    2015-10-27 14:49:00            30,55
    2015-10-27 14:50:00            30,87

    Aus dieser Tabelle mache ich mit einem Ereigniss (1 mal pro Tag) eine neue Tabelle (My_RaspPI_DAY) mit dem Durchschnittswert.
    Code:
    BEGIN
    
    TRUNCATE `My_RaspPI_DAY`;
    INSERT INTO `My_RaspPI_DAY`
    SELECT     DATE_FORMAT(`timevalue`,'%Y-%m-%d 00:00:00'),
                ROUND(AVG(`CPU_Temp`),2),
    FROM `MyDB`.`My_RaspPI`
    GROUP BY date_format(`My_RaspPI`.`timevalue`,'%d.%m.%Y');
    
    END
    Die Daten sehen dann ca. so aus:
    Code:
    timevalue                   | CPU_Temp
    ----------------------------|-----------------------
    2015-10-22 00:00:00            33,58
    2015-10-23 00:00:00            32,65
    2015-10-24 00:00:00            32,69
    2015-10-25 00:00:00            32,74
    2015-10-26 00:00:00            30,55
    Bis dahin fuktioniert auch alles bestens. NUR, ich möchte jetzt nicht das dieses Ereigniss immer und immer wieder die Durschnitswerte für alle letzten Tage errechnet, sondern nur für die neuen.

    Ich würde gern das, das Ereigniss folgendermaßen vorgeht:
    1.) den neuesten Eintrag (timevalue) aus der Tabelle (My_RaspPI_DAY) ermittelt. Hier den "2015-10-26"
    2.) diesen Eintrag in dieser Tabelle löscht
    3.) dann diese Tabelle mit den Durchschnittswerten aus Tabelle My_RaspPI ergänzt.
    Beginend vom "2015-10-26" (der gelöschte Eintag) bis zum neuesten Eintrag aus Tabelle My_RaspPI

    Hat einer ein paar Tips wie ich das machen kann.
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Du filterst bei deiner Insert-Abfrage die Daten der Ausgangstabelle auf den konkreten Tag. Wo genau ist da Dein Problem? Also, in PG "where ... = current_date -1 "
     
  3. SQL_Dummie

    SQL_Dummie Benutzer

    Naja "current_date -1" ist nicht sicher. Es kann ja sein dass schon seit ca. 10 Tagen keine neunen Durchschnittswerte in die Tabelle My_RaspPI_DAY geschrieben worden sind. Und da zum Beispiel der letzte Eintrag am 17.10.2015 gemacht wurde. Dann soll ja DIESES Datum als Basis genommen werden.


    Bitte nicht soviel über Sinn oder Unsinn der Tabellen usw. nachdenken.
    Das alles dient in erster Linie für mich um SQL Kenntnisse zu erlernen.
     
  4. ukulele

    ukulele Datenbank-Guru

    Dann vieleicht mit
    Code:
    WHERE DATE_FORMAT(`timevalue`,'%Y-%m-%d 00:00:00') NOT IN ( SELECT timevalue FROM My_RaspPI_DAY )
    Wird aber mit mehr Daten rechenlastiger.
     
  5. SQL_Dummie

    SQL_Dummie Benutzer

    Kann ich irgenwie ein SELECT Ergebniss zwischenspeichern?
    zb so:
    Code:
    MeineVariable = SELECT MAX(timevalue) FROM My_RaspPI_DAY;
    Dann sollte in dieser Variablen der Wert "2015-10-26 00:00:00" stehen.
    Und dieser Variable nehme ich dann zum löschen und zum einfügen der neuen Werte.
    Zb so:
    Code:
    DELETE FROM My_RaspPI_DAY WHERE timevalue >= MeineVariable
    Code:
    INSERT .... WHERE timevalue >= MeineVariable
     
  6. ukulele

    ukulele Datenbank-Guru

    Du kannst auch
    Code:
    WHERE date_format(`My_RaspPI`.`timevalue`,'%d.%m.%Y') > ( SELECT max(timevalue) FROM My_RaspPI_DAY ) 
    machen. Dann können aber theoretisch Lücken enstehen.
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Zum zwischenspeichern gibt es: tätäää: Tabellen. Aber das erscheint mir in dem Fall unnötig.
     
  8. SQL_Dummie

    SQL_Dummie Benutzer

    Ok. Vielen Dank euch beiden für die Tipps.
    Werde es mal heute abend probieren.
    Danke nochmals für die blitzschnellen Antworten.
     
  9. SQL_Dummie

    SQL_Dummie Benutzer

    So, nach vielen Versuchen habe ich es geschaft. "Leider" aber nur mit einer zusätzlichen Funktion.

    Meine Funktion "MyProg":
    Code:
    DECLARE MyVar TIMESTAMP;
    SELECT MAX(timevalue) INTO MyVar FROM My_RaspPI_DAY;
    RETURN MyVar;
    Und hier Abfrage / Ereigniss:
    Code:
    DELETE
    FROM My_RaspPI_DAY
    WHERE timevalue >= MyProg();
    
    INSERT INTO `My_RaspPI_DAY`
    SELECT     DATE_FORMAT(`timevalue`,'%Y-%m-%d 00:00:00'),
                ROUND(AVG(`CPU_Temp`),2),
                ROUND(MIN(`CPU_Temp`),2),
                ROUND(MAX(`CPU_Temp`),2)
    FROM `MyDB`.`My_RaspPI`
    WHERE date_format(`timevalue`,'%Y-%m-%d') > MyProg()
    GROUP BY date_format(`timevalue`,'%Y-%m-%d');
    Das Script macht auch komplett das was von mir gewünscht war.
    Einziger "Nachteil", dass eine zusätzliche Funktion benötigt wird.
    Hat jemand einen Verbesserungsvorschlag, oder noch besser eine Lösung ohne die Funktion?
     
  10. ukulele

    ukulele Datenbank-Guru

    Was spricht gegen
    Code:
    WHERE date_format(`timevalue`,'%Y-%m-%d') >( SELECT MAX(timevalue) INTO MyVar FROM My_RaspPI_DAY )
    Das sollte sogar MySQL hinbekommen, eventuell musst du date_format(`timevalue`,'%Y-%m-%d') erst noch zurück in timestamp konvertieren um vergleichen zu können.
     
  11. SQL_Dummie

    SQL_Dummie Benutzer

    Bei SELECT und DELETE mekert MySQL wenn ich INTO verwende.

    Und wenn ich das mache
    Code:
    WHERE date_format(`timevalue`,'%Y-%m-%d') >= ( SELECT MAX(timevalue) FROM My_RaspPI_Day )
    funktioniert das bei SELECT korrekt aber (warum auch immer) nicht bei DELETE.
     
  12. ukulele

    ukulele Datenbank-Guru

    Ja MySQL hat irgendwie ein Problem bei UPDATE und offensichtlich auch bei DELETE auf die selbe Tabelle die es verändert lesend zuzugreifen. Wenn man das verschachtelt kriegt man es oft umgangen, aber dann ist die Lösung mit der Funktion schon okay.
     
  13. SQL_Dummie

    SQL_Dummie Benutzer

    Alles klar. Danke für die Hilfe.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden