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

Beitrag lesen

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.