Announcement

Collapse
No announcement yet.

Abfrage AVG() mit datetime Feld?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Abfrage AVG() mit datetime Feld?

    Hallo Leute,

    also ich habe eine konkrete Frage bzgl. einem AVG() im Intervall von 5min. Mein table ist sehr simple:

    -------------------
    | data | datetime |
    -------------------
    | 12 | 2012-10-19 00:00:00 |
    ...

    Jetzt möchte ich ein AVG(data) im Intervall von 5min.

    Für einen bestimmten Zeitraum kann ich es auch.

    SELECT AVG( data) , TIMESTAMPDIFF(
    SECOND , '2012-10-16 12:00:00', '2012-10-16 12:05:00' )
    FROM `table`

    Aber ich möchte es automatisch von allen Werten haben? Wie mache ich das?

  • #2
    Es geht, ist aber in der Tat etwas umständlicher. Den von dir vorbereiteten "manuellen" Weg würde ich höchstens dann weitergehen, wenn die Lösung aus einem Anwenderprogramm heraus erfolgen soll. Mit reinem SQL habe ich zwei Vorschläge:

    Variante 1 mit einer berechneten Spalte
    Füge in den SELECT-Befehl eine Spalte ein, die aus der Datetime-Spalte mit TRUNC(ATE) oder CEIL(ing) die untere Grenze des 5-Minuten-Intervalls berechnet. (Eventuell muss noch mit CAST gearbeitet werden; außerdem ist mit ziemlicher Sicherheit zu multiplizieren. MySQL bietet relativ viele Funktionen; die Genauigkeit von DateTime beträgt 1 Sekunde.) Dann kannst du nach dieser Zusatzspalte gruppieren und den Durchschnitt bilden.

    Variante 2 mit einer Hilfstabelle
    Erzeuge eine Tabelle mit den Spalten "untere Grenze" und "obere Grenze". Jeder Datensatz steht für ein 5-Minuten-Intervall. Dann kannst du beide Tabellen verknüpfen, etwa so:
    Code:
    SELECT AVG(t.data), h.id
      FROM yourtable t
      JOIN hilfstabelle h ON t.yourcolumn >= h.untereGrenze and t.yourcolumn < h.obereGrenze
     GROUP BY h.id
    Die ON-Bedingung bei JOIN verträgt nicht nur Gleichheiten auf ID-Spalten, sondern alles, was in WHERE auch möglich ist.

    Variante 2 kann auch durch eine temporäre Tabelle ersetzt werden, die durch WITH eingebunden wird und die untere Grenze aus deiner Tabelle errechnet. Ob WITH bei MySQL möglich ist, habe ich jetzt nicht untersucht.

    Es gibt sicher noch weitere Varianten. Gruß Jürgen

    PS. Ich hoffe doch, dass die Spalte nicht "datetime" heißt. Schlüsselwörter als Namen von Tabellen oder Spalten sind hochriskant und möglichst zu vermeiden.

    Comment

    Working...
    X