Autor Zpráva
Erax
Profil *
Dobrý den,
ukládám si venkovní teplotu a ráda bych si udělala takový přehled o min(), max(), avg() za jednotlivé dny a měsíce. Potřebuji však poradit, jak udělat mySQL dotaz, aby to odpovídalo kriérii DEN, MĚSÍC.

V mySQL jsem použila ukládání teploty takto, snad dobře :)
teploty
id int(11) unsigned Auto Increment    
teplota_2m_meteo decimal(4,1)
timestamp    datetime    
time int(11) unsigned

Ukládám pro jistotu dva formátu času, protože si nejsem jistá, co je nejlepší používat.
timestamp: 2019-07-13 11:03:00
time: 1563008580

Neporadí mně někdo? Za Váš čas budu strašně moc ráda.

PS: zvažuji, že bych nastavila CRON na každý den a vždy za předchozí den provedla min, max, avg z daného dne a uložila zvlášť do mySQL, což by mohlo být lepší. Co myslíte?
Radek9
Profil
Erax:
Normálně si z toho datetimu vybereš rok, měsíc a den a podle toho uděláš group:
SELECT
  YEAR(timestamp),
  MONTH(timestamp),
  DAY(timestamp),
  MIN(teplota_2m_meteo),
  MAX(teplota_2m_meteo),
  AVG(teplota_2m_meteo)
FROM teploty
GROUP BY
  YEAR(timestamp),
  MONTH(timestamp),
  DAY(timestamp)
Keeehi
Profil
Erax:
zvažuji, že bych nastavila CRON na každý den a vždy za předchozí den provedla min, max, avg z daného dne a uložila zvlášť do mySQL, což by mohlo být lepší. Co myslíte?
To je zbytečné. Databáze je dostatečně výkonná, chytrá a rychlá a těch pár čísel by měla zvládnout spočítat úplně bez problémů.
Kdyby ti stanice každý den generovala miliony měření a těch stanic bys měla miliony, pak bys určitě nějakou optimalizaci potřebovala ale to asi nebude tvůj případ.
Erax
Profil *
Mockrát děkuji. Jak ale z mySQL dotazu co napsal Radek9 zjistím i datum a čas, kdy třeba daná hodnota min mac teploty byla? Ještě jednou moc děkuji za výpomoc.
Kajman
Profil
Jakou verzi mysql máte? Když je minimální a maximální teplota vícekrát za den, potřebujete všechny nebo se má vybrat jen některá?
Erax
Profil *
Používám starou verzi 5.0.51a. Půjde to vůbec? :)
Minimální a maximální jenom jednou, jenom nevím jak. V minimu časově hned někde na začátku a max někde na konci v rámci času? Nechci to ale komplikovat.
Kajman
Profil
V té staré to moc rychlé nebude. Lepší by byla databáze postgresql, ta umí window funkce i indexy nad funkcemi.

V té staré by to mělo jít pro jednotlivé dny (asi to bude pomalé) nějak takto:
SELECT g.*,
       (SELECT Min(t.timestamp)
        FROM   teploty t
        WHERE  Date(t.timestamp) = g.datum
               AND t.teplota_2m_meteo = g.tmin) casmin,
       (SELECT Max(t.timestamp)
        FROM   teploty t
        WHERE  Date(t.timestamp) = g.datum
               AND t.teplota_2m_meteo = g.tmax) casmax
FROM   (SELECT Date(timestamp)       datum,
               Min(teplota_2m_meteo) tmin,
               Max(teplota_2m_meteo) tmax,
               Avg(teplota_2m_meteo) tavg
        FROM   teploty
        GROUP  BY Date(timestamp)) g
ORDER  BY g.datum  

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0