Visualizzazione dei risultati da 1 a 3 su 3

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2014
    Messaggi
    1

    [MYSQL] Chiarimento su query creata per cercare dei valori MAX nel db

    Ciao ragazzi!
    Premetto che non ho esperienza approfondita con SQL, qualche giorno fa mi è stato proposto un problema che pensavo fosse semplice all'inizio ma che si è rivelato abbastanza rognoso per il mio livello di competenza in sql.

    Praticamente il lavoro va fatto su un db che è utilizzato esclusivamene per datalogging, quindi tutto in una tabella, buttato li. Mi è stato chiesto di tirare fuori dei dati specifici da questa tabella (allego in basso uno screenshot), in sostanza bisogna prendere il valore max della colonna "lettura" però deve essere fatto per l'ultima data disponibile di quel mese presente nel db, in sostanza l'ultima data di quel dato mese presente nel db con il suo corrispondente valore di lettura, ora tutto bene se non fosse che nel db il giorno è presente piu volte perchè il datalogger inserisce dati ogni 15 minuti circa.

    Capture.jpg

    dopo svariati tentativi dove riuscivo si a tirare fuori il valore di lettura ma la data veniva visualizzata piu volte e quindi avevo dei duplicati, scavando in internet sono arrivato a questo:

    Codice PHP:
    select max(t2.data) as data,
            
    max(t1.lettura) as letturaoratemperaturaariatemperaturapannelli,irraggiamentoid
    from meter t1
    inner join 
    (select data from meter where extractMONTH FROM data in (1)) t2 on t1.data t2.data
    union all
    select max
    (t2.data) as data,
            
    max(t1.lettura) as letturaoratemperaturaariatemperaturapannelli,irraggiamentoid
    from meter t1
    inner join 
    (select data from meter where extractMONTH FROM data in (2)) t2 on t1.data t2.data
    union all
    select max
    (t2.data) as data,
            
    max(t1.lettura) as letturaoratemperaturaariatemperaturapannelli,irraggiamentoid
    from meter t1
    inner join 
    (select data from meter where extractMONTH FROM data in (3)) t2 on t1.data t2.data
    union all
    select max
    (t2.data) as data,
            
    max(t1.lettura) as letturaoratemperaturaariatemperaturapannelli,irraggiamentoid
    from meter t1
    inner join 
    (select data from meter where extractMONTH FROM data in (4)) t2 on t1.data t2.data
    union all
    select max
    (t2.data) as data,
            
    max(t1.lettura) as letturaoratemperaturaariatemperaturapannelli,irraggiamentoid
    from meter t1
    inner join 
    (select data from meter where extractMONTH FROM data in (5)) t2 on t1.data t2.data
    union all
    select max
    (t2.data) as data,
            
    max(t1.lettura) as letturaoratemperaturaariatemperaturapannelli,irraggiamentoid
    from meter t1
    inner join 
    (select data from meter where extractMONTH FROM data in (6)) t2 on t1.data t2.data
    union all
    select max
    (t2.data) as data,
            
    max(t1.lettura) as letturaoratemperaturaariatemperaturapannelli,irraggiamentoid
    from meter t1
    inner join 
    (select data from meter where extractMONTH FROM data in (7)) t2 on t1.data t2.data
    union all
    select max
    (t2.data) as data,
            
    max(t1.lettura) as letturaoratemperaturaariatemperaturapannelli,irraggiamentoid
    from meter t1
    inner join 
    (select data from meter where extractMONTH FROM data in (8)) t2 on t1.data t2.data
    union all
    select max
    (t2.data) as data,
            
    max(t1.lettura) as letturaoratemperaturaariatemperaturapannelli,irraggiamentoid
    from meter t1
    inner join 
    (select data from meter where extractMONTH FROM data in (9)) t2 on t1.data t2.data
    union all
    select max
    (t2.data) as data,
            
    max(t1.lettura) as letturaoratemperaturaariatemperaturapannelli,irraggiamentoid
    from meter t1
    inner join 
    (select data from meter where extractMONTH FROM data in (10)) t2 on t1.data t2.data
    union all
    select max
    (t2.data) as data,
            
    max(t1.lettura) as letturaoratemperaturaariatemperaturapannelli,irraggiamentoid
    from meter t1
    inner join 
    (select data from meter where extractMONTH FROM data in (11)) t2 on t1.data t2.data
    union all
    select max
    (t2.data) as data,
            
    max(t1.lettura) as letturaoratemperaturaariatemperaturapannelli,irraggiamentoid
    from meter t1
    inner join 
    (select data from meter where extractMONTH FROM data in (12)) t2 on t1.data t2.data 
    una mastodontica query che oggettivamente sembra funzionare. ora dall'alto della mia ignoranza nel campo, ma non c'è un modo migliore di eseguire questa operazione? considerando che poi la stessa cosa la dovrò fare per ogni giorno del mese, mi viene mal di testa solo a pensarci :P
    lo scopo finale della query è tirare fuori dei dati che vanno sottratti l'uno con l'altro per poi finire su un grafico.
    Accetto qualsiasi tipo di suggerimento in merito.

    Grazie!


    Daniele
    Immagini allegate Immagini allegate

  2. #2
    Hai un numero progressivo della lettura per cui il max(lettura) corrisponde anche al max(data-ora) del dato mese (quindi anche viceversa)

    devi solo selezionare anno-mese e ordinare per data, ora desc
    Es per la lettura di febbraio 2014:

    select *
    from tabella
    where data between '2014-02-01' and last_day('2014-02-01')
    order by data, ora desc
    limit 1

    Ti sceglie automaticamente l'ultimo giorno del mese dove l'ordinamento prendera' l'ultimo valore inserito nel mese di febbraio e che corrispondera' anche alla max lettura di quel mese.

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

  3. #3
    ciao,
    forse ho capito male io la necessità ma se veramente vuoi solo la MAX per il campo lettura raggruppando per data dell'ultimo giorno disponibile e ci sono più righe per data credo che ti basti fare così:
    SELECT Data, MAX(lettura) AS MAXLETTURA
    FROM meter
    GROUP BY Data
    HAVING Data=(Select MAX(Data) FROM meter)
    Se ti stai approcciando all'argomento database dai uno sguardo anche a: SQL, database relazionale, regole di Codd, modello E-R, forme normali, normalizzazione con il mio testo: Semplicemente Database

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 © 2026 vBulletin Solutions, Inc. All rights reserved.