MySQL Select: Zusammenfassen von Daten und bilden von Durchschnitt?

  • Themenstarter Themenstarter tuxedo
  • Beginndatum Beginndatum
T

tuxedo

Gast
Hallo zusammen ...

ich hab hier eine DB die im 5min Takt mit Temperatur- und anderen Werten gefüllt wird. Das Schema ist sehr einfach:

Code:
ID | Timestamp | Wert1 | Wert2 | Wert3 | ... | Wert_n

Diese Daten sollen in einer Grafik (Line-Plot) angezeigt werden.

Wenn ich jetzt z.B. die letzten 7 Tage anzeigen will, dann hab ich 2016 Datensätze/Zeilen aus der DB.

Die Grafik hat aber nur 504px in der Breite (hab jetzt al absichtlich passende Zahlen genommen damit man schöner rechnen kann). Wenn ich jetzt die 2016 Werte auf die 504px breite verteile, wird die Grafik etwas hässlich: Ich hätte pro Pixel 4 Werte.

Ich könnte das programmatisch lösen: Über die Daten iterieren und je 4 Werte zusammenfassen und Durchschnitt bilden. Damit würde ich die 2016 Werte auf 504 Werte reduzieren, was zur Grafik passen würde.

Würde das aber am liebsten über die DB regeln.
Deshalb die Frage:
Gibt es eine Möglichkeit via SQL (speziell MySQL) Werte zusammenzufassen und daraus einen durchschnitt zu bilden um somit die Anzahl der Ergebniszeilen (in diesem Beispiel) von 2016 auf 504 zu reduzieren?

Gegoogelt hab ich schon. Aber ich weiß nicht so recht nach was ich suchen soll. Hab bis dato nur Statements gefunden mit denen man jede n-te Zeile aus der DB ausließt. Aber damit würde ich das Ergebnis in der Grafik ja verfälschen...

Gruß
Alex
 
Hi,

ich glaube nicht, dass dies die Aufgabe der Datenbank ist, da dies Business Logik ist.

Ich hätte von dem Plotter erwartet, dass man da einstellen kann, welche Intervalle er darstellt.

Excel kann das auch.

Gruß,

Martin
 
Mir gings eher drum dass die DB viele (oder manche) Berechnungen eben schneller erledigen kann als ich das im Programm-Code kann. Und die Kiste auf der das ganze läuft ist technisch bedingt eh' nicht die schnellste (Embedded ARMv5).

Sehe das auch nicht so ganz als Business-Logik an... Im Endeffekt ist das ein View-Thema: ganz allgemein schränke ich mit einem SELECT die Sicht auf die Daten ein. Sonst würde man in SQL nicht Befehle wie AVG und SUM haben ... Kann man ja alles in Business-Logik gießen.. Macht aber nicht überall Sinn.
Mein Vorhaben ist im Prinzip nichts anderes.

Klar, implementiert ist das recht schnell (nein, der Graph-Plotter macht das leider nicht für mich). Aber wenn ich das mit MySQL direkt erledigen kann, wäre das für mich geschickter.

Bin nach wie vor für Ratschläge offen.

Gruß
Alex
 
Also in PostgreSQL wäre das Stichwort Window Function. Dabei kann man Partitionen erzeugen und innerhalb dieser Partitionen aggregieren.

Ich würde wahrscheinlich versuchen, die Tabelle mit einer Serie zu joinen und über Modulo 4 dann die Gruppierung erstellen.

Vielleicht hat MySQL ja ähnliche Features oder Du kannst sie mit Stored Procedures nachbauen.
 
haben die Werte selber oder kann man ihnen eine solche 'Serie' zudichten, eine lineare Nummerierung, bestenfalls schon die Id?
dann könnte man die Tabelle 4fach joinen, für die erste nur jeden 4. Eintrag wählen, modulo rechnen,
die anderen Tabellen mit id +1, +2, +3 joinen,
aus diesen 4 Einträgen zusammen irgendwas machen

allzu variabel ist das sicherlich nicht, falls nich von Java zusammengebaut, dann ginge statt 4 auch 6 oder anderes
 

Zurück
Oben