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

Discussione in 'PHP' iniziata da samurai.sette, 9 Novembre 2019.

  1. samurai.sette

    samurai.sette Utente Attivo

    Registrato:
    17 Dicembre 2015
    Messaggi:
    203
    Mi Piace Ricevuti:
    5
    Punteggio:
    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.
     
  2. Tommy03

    Tommy03 Utente Attivo

    Registrato:
    6 Giugno 2018
    Messaggi:
    72
    Mi Piace Ricevuti:
    5
    Punteggio:
    8
    Sesso:
    Maschio
    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.'";
    }
    }
     
  3. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    1.007
    Mi Piace Ricevuti:
    57
    Punteggio:
    48
    Sesso:
    Maschio
    Occupazione:
    Dev Full Stack
    Località:
    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: 10 Novembre 2019
  4. samurai.sette

    samurai.sette Utente Attivo

    Registrato:
    17 Dicembre 2015
    Messaggi:
    203
    Mi Piace Ricevuti:
    5
    Punteggio:
    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!
     
  5. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    1.007
    Mi Piace Ricevuti:
    57
    Punteggio:
    48
    Sesso:
    Maschio
    Occupazione:
    Dev Full Stack
    Località:
    IT/SW
    Nel post precedente, ho invertito Group BY!
    Corretto.....
    Codice:
    GROUP BY DATE_FORMAT(datetime, "%d-%m-%Y"),
    DATE_FORMAT(datetime, "%H")
    
    Piccola precisazione... dalle 00:00 alle 02:59 poi dalle 03:00 alle 05:59 corretto?

    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: 11 Novembre 2019
  6. samurai.sette

    samurai.sette Utente Attivo

    Registrato:
    17 Dicembre 2015
    Messaggi:
    203
    Mi Piace Ricevuti:
    5
    Punteggio:
    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!!!
     
Sto caricando...

Condividi questa Pagina