Stefan: MySQL: Durchschnitt über Zeitraum von x-Tagen für alle Werte?

Hallo zusammen,

mein vereinfachtes Problem:
ich habe eine Tabelle mit einem DATE und einem Float.
Für jeden Wochentag gibt es exakt einen Eintrag mit einem Wert.

Nun will ich per MySQL-Abfrage zu jedem Wert den Durchschnittswert der letzten x-Tage berechnen und in das Feld Average speichern....

Hat mir da jemand einen Tipp?

SELECT AVG(fWert) FROM tTable, bekomme ich den Gesamtschnitt.
SELECT AVG(fWert) FROM tTable ORDER BY DATE DESC LIMIT 0,7 => Erhalte ich den Schnitt der Letzten 7 Einträge,
aber wie erhalte ich für jeden Wert den Schnitt der letzten 7 Tage?

DANKE im Voraus!!!

  1. Moin,

    aber wie erhalte ich für jeden Wert den Schnitt der letzten 7 Tage?

    Ich bin nicht ganz sicher, ob ich dich richtig verstanden habe, aber das sollte funktionieren:

    SELECT  
       *,  
       (SELECT AVG(fWert) FROM tTable ORDER BY DATE DESC LIMIT 0,7)  
    FROM tTable  
    ORDER BY DATE DESC LIMIT 0,7
    

    Alternativ auch so:

    SELECT  
       T.*, D.Durchschnitt  
    FROM tTable as T  
    JOIN (SELECT AVG(fWert) FROM tTable ORDER BY DATE DESC LIMIT 0,7) as D ON 1=1  
    ORDER BY DATE DESC LIMIT 0,7
    

    (ich weiß jetzt nicht genau, ob MySQL das so macht, weil ich momentan viel MSSQL mache)

    Grüße Marco

    --
    Ich spreche Spaghetticode - fließend.
  2. Tach!

    SELECT AVG(fWert) FROM tTable, bekomme ich den Gesamtschnitt.
    SELECT AVG(fWert) FROM tTable ORDER BY DATE DESC LIMIT 0,7 => Erhalte ich den Schnitt der Letzten 7 Einträge,
    aber wie erhalte ich für jeden Wert den Schnitt der letzten 7 Tage?

    Was bedeutet "für jeden Wert"? Meinst du: Nimm den neuesten Datensatz, bilde von dessen Datum aus 7 Tage rückwärst den Durchschnitt dieser Werte und füge ihn in das Feld average. Nimm den Datensatz vorher und bilde davon ausgehend 7 Tage zurück den Durchschnitt. Und so weiter?

    Limit geht zwar, aber Datumsberechnung wäre besser, weil es dann auch bei Aussetzern nur 7 Tage zurück berücksichtigt und nicht 7 Werte inklusive der fehlenden Tage.

    Mit Limit müsstest du die Datensätze kleiner als das aktuelle Datum nehmen, sie sortieren und die 7 neuesten behalten. Aber da ein LIMIT erst auf das Gesamtergebnis wirkt, zählt die Aggregatfunktion bereits vorher alle Datensätze, (für die das WHERE gilt) und liefert dann nur einen einzelnen Datensatz. Das LIMIT hat dann nichts mehr zu tun. Also muss das Limitieren in eine Subquery und dann kannst du aus dessen Ergebnis den Durchschnitt berechnen. Und das muss wieder in eine Subquery, eine correlated diesmal, die vom Datum der Hauptquery ausgeht.

    Mit Datumsberechnung sparst du eine Subquery. Die Bedingung "letzte 7" wandert nun auch ins WHERE (BETWEEN datum_vom_hauptquery AND datum_vom_hauptquery - INTERVAL 7 DAY) und das AVG() wirkt direkt auf diese eingeschränkte Menge.

    dedlfix.