# Mittelwert in einer MySQL Datenbank von Stundenwerten?



## trexis5 (19. Dezember 2008)

Hi,

ich habe eine Tabelle mit Wetterwerten.
z.B. Temp und Feuchte und Regen usw.

Dann habe ich immer eine Zeile je 15min, also 4 Einträge je Stunde.






Wie kann ich nun z.B. den Mittelwert je Stunde erzeugen?

Danke.


----------



## kuddeldaddeldu (19. Dezember 2008)

Hi,

gruppiere nach Stunde und lass die Mittelwerte mit der Average-Funktion berechen.

LG


----------



## katosan (19. Dezember 2008)

SELECT avg(wert) FROM `wetter` group by stunde

dabei muss stunde natürlich einen grupierbaren wert haben


----------



## trexis5 (19. Dezember 2008)

Hi,

danke mal, aber dann habe ich ja nur nach Stunden Sortiert, aber keinen Bezug mehr auf das Datum oder?

Momentan habe ich diese Grafiken gemacht.
http://www.auto-steuerung.de/htm/info/hauptframe.php

Dann will ich Balken machen mit den Mittelwerten bezogen auf die Stunde, also z.B. 24 Balken für einen Tag.


----------



## katosan (19. Dezember 2008)

joa schau doch mal in das mysql handbuch da gibt es so tolle funktionen


```
SELECT  DATE_FORMAT( stunde, '%d.%m.%Y:%H' ),avg( wert )
FROM wetter
GROUP BY DATE_FORMAT( stunde, '%D.%M.%Y:%H' )
```


----------



## kuddeldaddeldu (19. Dezember 2008)

Hi,

das wird ihm wohl nichts bringen, da er ja alle Datensätze einzeln und pro Stunde einen zusätzlichen Balken mit den Mittelwerten ausgeben will, wenn ich das richtig verstanden habe.

In diesem Fall würde ich die Mittelwerte in PHP in der Schleife ausrechnen und einen Gruppenwechsel über das Feld Stunde programmieren.

LG


----------



## katosan (19. Dezember 2008)

ja aber das sql macht doch genau das es berechnet für jede stunde den mittelwert


----------



## kuddeldaddeldu (19. Dezember 2008)

Hi,



katosan hat gesagt.:


> ja aber das sql macht doch genau das es berechnet für jede stunde den mittelwert



er möchte aber für jede Stunde alle 4 Datensätze anzeigen. Die hat er aber bei einer Gruppierung nicht. D.h. er braucht auf jeden Fall eine nicht gruppierte Abfrage und dann kann er die Mittelwerte auch in der Schleife per PHP ausrechnen.

LG


----------



## katosan (19. Dezember 2008)

kuddeldaddeldu hat gesagt.:


> Hi,
> 
> 
> 
> ...




Hi,

ist natürlich ein Argument, wobei zwei SQL - Statements warscheinlich auch nicht signifikant lagsamer sind.

Die Frage wäre natürlich jetzt ob nicht auch die anderen Daten  stundenweise gruppiert werden sollen sonst wird die Tabelle wohl doch etwas länglich.

Gruß

katosan


----------



## trexis5 (20. Dezember 2008)

Hi,

erstmal vielen Dank für die vielen Antworten.

Also ist das auf alle Fälle nicht mal schnell gemacht.
Muss ich mal sehen ob ich da was hinbekomme.
Ich melde mich wieder.


----------



## spikaner (20. Dezember 2008)

Könnte es nicht so auch funktionieren? (Sprich über die ID da diese ja auto_increment ist...)

```
$y = $startid
$k=0;
for($i = $y; $i < ($y+96))
{
    for($i = $y; $i < ($y+4); $i++)
    {
    $l=0;
    $sql_query_string = "SELECT Temp FROM tabelle WHERE id = '".$i."'";
    $result = mysql_query($sql_query_string) or die('query fehlgeschlagen');
    $temp[$l] = mysql_fetch_object($result);
    $l++;
    }
    $tempstunde[$k]=($temp[0] + $temp[1] + $temp[2] + $temp[3]) / 4;
    $k++;
}
```
Ist nur ein Ansatz und hat bestimmt noch Fehler... 

mfg Spikaner


----------



## kuddeldaddeldu (20. Dezember 2008)

Hi,

hmm, das ist aber schon sehr umständlich. Vor allem sollte man DB-Abfragen innerhalb von Schleifen auf jeden Fall vermeiden. Die Datensätze an sich bekommt er ja schon in gewünschter Reihenfolge mit einer Abfrage. Da muss er doch nur noch in der Schleife nebenbei die Werte kumulieren und immer, wenn die Stunde wechselt, die Mittelwerte berechnen, den gewünschten Balken ausgeben und die Variablen zurücksetzen.

So eine große Sache ist das doch gar nicht... 

LG


----------



## trexis5 (20. Dezember 2008)

@kuddeldaddeldu

Das hört sich gut an. Cool.
Haste vielleicht einen TiP?

@spikaner
So ähnlich mache ich es in meinem VB-Programm
Dorl lese ich eine csv-Datei ein und dann alle 96 Schritte mache ich den Mittelwert.

Aber wenn nun nur 50 Werte vorhanden sind von einem Tag ist alles verschoben.

Da ist das was *kuddeldaddeldu* vorschlögt interessant [wenn die Stunde wechselt], also nach der Stunde suchen. Dann passt auch der Bezug.

by


----------



## trexis5 (20. Dezember 2008)

Hi,

also soweit habe ich es mal gemacht.
http://www.auto-steuerung.de/wetter/jpgraph/graph/avg_monat_regen.php

Nun muss ich noch die Differenz ausrechnen von Tag zu Tag.

Das ist momentan die Abfrage:


```
$ResultPointer = mysql_query("SELECT SUBSTRING(Datummetric, 1, 20)  Datummetric, $Diagrammvar FROM $Tablegraph WHERE `Jahr` between $data_jahr_start and $data_jahr_ende and `Monat` between $data_monat_start and $data_monat_ende AND `Tag` between $data_tag_start and $data_tag_ende ORDER BY SUBSTRING(Datetime, 1, 20)", 

$DatabasePointer);
$erhoehen = 1;
for($i=0, $datax="", $datay=""; $i<mysql_num_rows($ResultPointer); $i++)
{
   $var1_temp = mysql_fetch_object($ResultPointer);
   $datax[] = $var1_temp->Datummetric;
   //$datay[] = $var1_temp->$Diagrammvar;
   $data_leer[] = "";
   $erhoehen++;
   $datax_avg_temp_1 = $var1_temp->Datummetric;
   
   if ($datax_avg_temp_1 <> $datax_avg_temp_2) 
   { 
   $datax_avg[] = $var1_temp->Datummetric; 
   $datay[] = $var1_temp->$Diagrammvar;
   }
   else 
   {
   //$datax_avg[] = ""; 
   }

   $datax_avg_temp_2 = $datax_avg_temp_1;

}
```

Ich hoffe das ist Technisch ok.


----------



## trexis5 (20. Dezember 2008)

Hi,

so fertig:
http://www.auto-steuerung.de/wetter/jpgraph/graph/aktuell_monat_regen_avg.php


```
//Daten aus der MySQL-Tabelle auslesen
$DatabasePointer = mysql_connect($DatabaseHost, $DatabaseUser, $DatabasePassword);
mysql_select_db($Database, $DatabasePointer);
// Mit Datum
$ResultPointer = mysql_query("SELECT SUBSTRING(Datummetric, 1, 20)  Datummetric, $Diagrammvar FROM $Tablegraph WHERE `Jahr` between $data_jahr_start and $data_jahr_ende and `Monat` between $data_monat_start and $data_monat_ende AND `Tag` between $data_tag_start and $data_tag_ende ORDER BY SUBSTRING(Datetime, 1, 20)", 


$DatabasePointer);
$erhoehen = 1;
$zaehler_1 = 2;
$zaehler_2 = 3;
$zaehler_3 = 1;
$zaehler_4 = 0;
for($i=0, $datax="", $datay=""; $i<mysql_num_rows($ResultPointer); $i++)
{
   $var1_temp = mysql_fetch_object($ResultPointer);
   $datax[] = $var1_temp->Datummetric;
   //$datay[] = $var1_temp->$Diagrammvar;
   $data_leer[] = "";
   $erhoehen++;
   $datax_avg_temp_1 = $var1_temp->Datummetric;
   
   if ($datax_avg_temp_1 <> $datax_avg_temp_2) 
   { 
   
   $datax_avg[] = $var1_temp->Datummetric; 
   $datay[] = $var1_temp->$Diagrammvar; 
   
   
      if($zaehler_4 >= 3){      
      
          $datay_1[$zaehler_3] = $datay[$zaehler_2] - $datay[$zaehler_1];
	      
	      $zaehler_3++;  //neues Array
		  $zaehler_1++;  //voriger Tage
          $zaehler_2++;  //nächster Tag
      }

   $zaehler_4++; // erst ab 3tem Wert beginnen

   }


   $datax_avg_temp_2 = $datax_avg_temp_1;  // vergleich auf Tag ungleich

}
```

IUch hoffe nur das ist Technisch ok.
Ansonsten vielen Dank für die Hilfe.


----------

