Ereigniss, neue Tabelle mit Duchschnittswerten

SQL_Dummie

Benutzer
Beiträge
24
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.
 
Werbung:
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 "
 
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.
 
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.
 
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
 
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.
 
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.
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

Einziger "Nachteil", dass eine zusätzliche Funktion benötigt wird.
Hat jemand einen Verbesserungsvorschlag, oder noch besser eine Lösung ohne die Funktion?
 
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.
 
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.
 
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.
 
Werbung:
Zurück
Oben