[PHP] Estrarre dati da tabella e fare la media ad intervalli di tempo

samurai.sette

Utente Attivo
17 Dic 2015
228
6
18
Ciao a tutti. Mi trovo in una situazione un pò particolare ma non riesco a venirne fuori.
Da una tabella mysql vorrei estrarre tutti i dati di una colonna e fare la media dei valori inclusi ogni ora (ad esempio la media di tutti i valori compresi tra le ore 00:00 e 01:00, poi la media dei valori compresi tra le ore 01:00 e 02:00 e così per il resto di tutti i valori).
Qualcuno ha un consiglio su come muovermi?
Ciao, grazie mille.
 

Tommy03

Utente Attivo
6 Giu 2018
435
45
28
17
Bassano del Grappa (VI)
Prova così:
PHP:
for($i=0;$i<24;$i++){
if($i<10){
$numero=str_pad($i,2,0,STR_PAD_LEFT);
}else{
$numero=$i;
}
$orario=$numero.":00";
$fine=$numero+1;
$limite=$fine.":00";
$query=mysqli_query($conn,"SELECT AVG(nome_campo) AS media FROM tabella WHERE campo_orario>='$orario' AND campo_orario<='$orario'");
while($ricevi=mysqli_fetch_assoc($query)){
$media = $ricevi['media'];
echo "Tra le ore '.$numero.' e '.$limite.', la media è di '.$media.'";
}
}
 

macus_adi

Utente Attivo
5 Dic 2017
1.266
82
48
IT/SW
Semplificando un pò la questione evitando inutili cicli da codice e un numero di query spropositato, si potrebbe effettuare una (1) query ed ottenere tutti i risultati semplicemente con questo:
PHP:
$query='
SELECT
  DATE_FORMAT(datetime, "%d-%m-%Y") AS data,
  DATE_FORMAT(datetime, "%H") AS orario,
  AVG(val) AS med
FROM TABELLA
GROUP BY DATE_FORMAT(datetime, "%H"),
         DATE_FORMAT(datetime, "%d-%m-%Y")';
//questa riga è da cambiare
$data=$conn->query($query)->fetch_all();
print_r($data);
 
Ultima modifica:

samurai.sette

Utente Attivo
17 Dic 2015
228
6
18
Ciao ragazzi, grazie mille per l'aiuto. Devo dire che entrambe le soluzioni sono molto belle (si capisce subito che siete molto preparati in materia!).
Scusate se ne approfitto, ma se la media dei dati deve essere effettuata a intervalli di tempo di 3 ore? Ad esempio tra le ore 00:00 e le 03:00, poi tra le ore 03:00 e le 06:00 e così via.
Ciao, grazie mille!
 

macus_adi

Utente Attivo
5 Dic 2017
1.266
82
48
IT/SW
Nel post precedente, ho invertito Group BY!
GROUP BY DATE_FORMAT(datetime, "%H"),
DATE_FORMAT(datetime, "%d-%m-%Y")'
;
Corretto.....
Codice:
GROUP BY DATE_FORMAT(datetime, "%d-%m-%Y"),
DATE_FORMAT(datetime, "%H")
00:00 e le 03:00
Piccola precisazione... dalle 00:00 alle 02:59 poi dalle 03:00 alle 05:59 corretto?

intervalli di tempo di 3 ore
Per la nuova richiesta, sempre sfruttando solo il DB basterebbe dividere l'orario per il valore passato in questo caso "3".
Codice:
SELECT
  DATE_FORMAT(datetime, "%d-%m-%Y") AS data,
  FLOOR(DATE_FORMAT(datetime, "%H")/3) AS orario,
  AVG(val) AS med
FROM TABELLA
GROUP BY DATE_FORMAT(datetime, "%d-%m-%Y"),
        FLOOR(DATE_FORMAT(datetime, "%H")/3)
 
Ultima modifica:

samurai.sette

Utente Attivo
17 Dic 2015
228
6
18
Ciao ragazzi. Scusate se non ho risposto subito.
Per Macus_adi: grazie mille per l'aiuto, la tua soluzione funziona alla grande!!! :)
Per Tommy03: grazie mille anche a te, anche la tua soluzione è molto bella e funzionale. :)
Ciao!!!
 

samurai.sette

Utente Attivo
17 Dic 2015
228
6
18
Ciao ragazzi. Riapro questa discussione perché mi trovo in difficoltà nell'estrazione dei dati e nel fare la loro media ad intervalli di tempo.
L'aiuto che mi avevate dato è stato molto utile in quanto sono riuscito ad estrarre i dati e fare la loro media ad intervalli di tempo di 3 ore.
Ora mi trovo nella stessa situazione ma l'intervallo di tempo è passato da 3 ore a 30 minuti ma i dati che mi "genera" non sono corretti.
Quello che ho scritto è questo:
PHP:
<?php
    $con = mysqli_connect ("localhost", "root", "", "meco");
    $query = mysqli_query ($con, 'SELECT AVG(spostamento2) AS media FROM monit GROUP BY DATE_FORMAT(data, "%d-%m-%Y"), FLOOR (DATE_FORMAT(ora, "%H")/0.5)');
    while ($result = mysqli_fetch_assoc($query))
    {
        $dati[] = $result['media'];
    }
    echo "<pre>";
    print_r($dati);
    echo "</pre>";
?>
Vi riporto anche due immagini in cui faccio vedere i dati della tabella e i dati che mi genera il PHP.
tab.jpg
php.jpg

Ovviamente la tabella è molto più lunga (contiene 500 righe). Secondo voi dove sbaglio?
Ciao, grazie mille.
 
Ultima modifica:

Tommy03

Utente Attivo
6 Giu 2018
435
45
28
17
Bassano del Grappa (VI)
È un po' contorto ma potrebbe funzionare:
PHP:
for($i=0;$i<47;$i++){
$decimale=$i/2;
if(is_int($decimale) == 1){
$orario=$decimale.":00";
$limite=$decimale.":30";
}else{
$parteintera=intval($decimale);
$orario=$parteintera.":30";
$boh=$parteintera+1;
$limite=$boh.":00";
}
$query=mysqli_query($conn,"SELECT AVG(nome_campo) AS media FROM tabella WHERE campo_orario>='$orario' AND campo_orario<='$limite'");
while($ricevi=mysqli_fetch_assoc($query)){
$media = $ricevi['media'];
echo "Tra le ore '.$orario.' e '.$limite.', la media è di '.$media.'";
}
}
 

samurai.sette

Utente Attivo
17 Dic 2015
228
6
18
Ciao Tommy03, scusa se non ho risposto subito ma sono stato un po' impegnato.
Il codice che mi hai scritto funziona abbastanza bene.
Grazie, ciao.