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

samurai.sette

Utente Attivo
17 Dic 2015
235
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.
 
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.'";
}
}
 
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:
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!
 
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:
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!!!
 
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:
È 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.'";
}
}
 
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.
 
Ciao a tutti.
Riapro dopo tanto tempo questa discussione perché mi trovo in una situazione molto simile ma non riesco a risolvere.
In passato dovevo estrarre i dati di una singola colonna (di cui conoscevo il nome) ed ottenere la media dei valori ad intervalli di tempo. Ora devo estrarre i dati di tutte le colonne (di cui NON conosco il nome) ed effettuare le medie ad intervalli di tempo per ciascuna colonna; Quindi devo ottenere la media dei dati della colonna0, la media dei dati della colonna1, ecc.
Finora per una singola colonna ho fatto in questo modo:
PHP:
$query= mysqli_query($con, 'SELECT DATE_FORMAT(data, "%d-%m-%Y") AS data, FLOOR(DATE_FORMAT(ora, "%H")/2) AS orario, ROUND (AVG(colonna0),7) AS med
FROM tabella GROUP BY DATE_FORMAT(data, "%d-%m-%Y"), FLOOR(DATE_FORMAT(ora, "%H")/2) ORDER BY id');
Come dovrei fare per tutte le colonne?
Grazie mille a tutti, ciao.
 

Discussioni simili