Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Query Mysql, database temporale, DIFFICILE

    Ciao a tutti,

    è un po' che non mi capitava qualcosa su cui non mi vengono buone idee e ho pensato di scrivere dopo molto tempo sul forum di Html.it.

    <sono tornato ragazzi!!>

    Vabbè, bando alle ciance, il mio problema riguarda una query mysql.
    In un database archivio i dati in maniera temporale, uno dei dati che archivio è una quantità che cresce incessantemente: 89802, 3299990, 392088484233, etc.

    Ogni INSERT inserisce un record che può essere visualizzato così:

    DATA | VALORE
    timestamp 2340
    timestamp 6743
    timestamp 8983
    timestamp 12999
    timestamp 14500
    timestamp 54893
    timestamp 90987

    Ora, avrei bisogno di estrarre il differenziale tra un record e un altro record.
    Quindi mi servirebbe avere per ogni record la differenza dal record precedente.
    Tuttavia l'unico indice per rintracciare il record più vicino risulta essere la semplice data.

    Potrei usare una SUBQUERY, potrei usare un LEFT JOIN specificando clausole WHERE molte ristrettive, oppure potrei scaricare i record +1 e poi usare PHP per calcolare i differenziali.

    Voi cosa fareste?
    Io ho una mia idea... ma mi sembra veramente poco performante quindi chiedo a voi.

    Ciao belli

  2. #2
    usa il php.

    carichi i valori in un array ordinati dalla data e poi scorri l'array eseguendo la sottrazione.

    un esempio:

    codice:
    query... order by timestamp ASC
    
    while ......
    {
    $valore[] = $row['valore'];
    }
    
    $num = 1;
    $num1 = count($valore);
    
    foreach($valore as $key => $value) {
     
        if($num < $num1) {
           $key1 = $key + 1;
           echo $valore[$key1] - $valore[$key] ."
    ";
           $num++;
          }
      }
    dovrebbe funzionare.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Okey, ci avevo pensato.

    Speravo di trovare una soluzione Mysql.... cmq alla fine so già che finirò per fare così. E' impossibile pretendere di restituire un set di risultati con il differenziale senza consumare più risorse che usare semplicemente PHP.


    Boh... magari qualche comando particolare... dovrei sfogliarmi tutta la guida di MySql.

    Intanto ringrazio Piero, attualmente è la soluzione più implementabile.

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Non puoi proprio aggiungere un contatore alla tua tabella?
    Così sarebbe facile.

    codice:
    create table prova
    (id int not null,
    valore int not null)
    
    insert into prova values 
    (1,2340),
    (2,6743),
    (3,8983),
    (4,12999),
    (5,14500),
    (6,54893),
    (7,90987)
    
    select tab1.id,tab2.id,tab1.valore,tab2.valore as succ,tab2.valore-tab1.valore as diff
    from prova as tab1, prova as tab2
    where tab1.id+1= tab2.id 
    order by tab1.id asc

  5. #5
    Originariamente inviato da nicola75ss
    Non puoi proprio aggiungere un contatore alla tua tabella?
    Così sarebbe facile.
    Avevo ipotizzato un qualcosa di simile ma da eseguire su una tabella temporanea, cioe' da ripetere ogni volta. Il rischio possibile (da considerare) e' la possibilita' di cancellazioni e/o modifiche all'id progressivo. L'id dovrebbe essere sempre consecutivo, mentre la richiesta era per la differenza tra due "timestamp" non definiti, cioe' non definito il "tipo" di timestamp. Potrebbe anche essere un timestamp autoaggiornante o anche no, per quello che ne sappiamo.

    Quindi la soluzione in php supera tutte le eccezioni possibili, oppure anche una query su tabella temporanea con un id autoincrement e selezionando i record da inserire ordinati per data. Ma preferisco la soluzione con php.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Originariamente inviato da piero.mac
    Avevo ipotizzato un qualcosa di simile ma da eseguire su una tabella temporanea, cioe' da ripetere ogni volta. Il rischio possibile (da considerare) e' la possibilita' di cancellazioni e/o modifiche all'id progressivo. L'id dovrebbe essere sempre consecutivo, mentre la richiesta era per la differenza tra due "timestamp" non definiti, cioe' non definito il "tipo" di timestamp. Potrebbe anche essere un timestamp autoaggiornante o anche no, per quello che ne sappiamo.

    Quindi la soluzione in php supera tutte le eccezioni possibili, oppure anche una query su tabella temporanea con un id autoincrement e selezionando i record da inserire ordinati per data. Ma preferisco la soluzione con php.
    Hai ragione, avevo semplificato troppo senza considerare tutte le evenienze.

  7. #7
    Originariamente inviato da piero.mac
    Avevo ipotizzato un qualcosa di simile ma da eseguire su una tabella temporanea, cioe' da ripetere ogni volta. Il rischio possibile (da considerare) e' la possibilita' di cancellazioni e/o modifiche all'id progressivo. L'id dovrebbe essere sempre consecutivo, mentre la richiesta era per la differenza tra due "timestamp" non definiti, cioe' non definito il "tipo" di timestamp. Potrebbe anche essere un timestamp autoaggiornante o anche no, per quello che ne sappiamo.

    Quindi la soluzione in php supera tutte le eccezioni possibili, oppure anche una query su tabella temporanea con un id autoincrement e selezionando i record da inserire ordinati per data. Ma preferisco la soluzione con php.
    Esatto, l'idea iniziale era il contatore ma non regge. I motivi possono essere 2: i DELETE, oppure la tabella riporta valori di diversi soggetti. Ovvero esiste un terzo campo:

    SOGGETTO | DATA | VALORE

    In tal caso aggiungere un autoincrement è assolutamente inutile perchè l'n-1 record potrebbe essere riferito ad un soggetto diverso. (naturalmente i dati vengono estratti con la clausola WHERE soggetto = $soggetto.

    A quel punto avere un autoincrement o avere un timestamp è assolutamente uguale, ci sono cmq dei salti.

    Pensavo ad un LEFT JOIN inizialmente.... solo che ho paura MySql si legga per ogni record estratto nuovamente tutta la tabella di LEFT JOIN per calcolare il valore Timestamp più vicino, ovvero farebbe (Nrecord+1) letture sulla stessa tabella, consumando eccessive risorse.



    Massì ho già implementato la soluzione PHP, anche se in genere preferisco avere set di risultati puliti e non da ritoccare manualmente con PHP..... vaaaaaabbè... mi adeguo all'efficienza.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.