Autor Zpráva
Vikes
Profil
Zdravím,
mám databázi teplot z měření kde která má 7 sloupců:
id, datum, cas, t1, t2, t3, t4

kde t1 až t4 jsou teploty. Do této tabulky jsou zapisovány každou minutu hodnoty.
Z hodnot casu a teplot vykresluji pomocí Open Flash Chart graf. Pokud vykresluji hodnoty do grafu jen pro jeden den je to vcelku funkční. Rád bych ale vykresloval hodnoty pro týden, nebo pro celé sledované období (což už je několik tisíc hodnot). Zvolím si tedy maximální počet počet hodnot, který mi Open Flash Chart dobře vykreslí a tento předem definovaný počet hodnot bych potřeboval vybrat z databáze. Mým cílem je tedy naformulovat dotaz, který mi vybere z databáze hodnoty teplot a časů se zvoleným krokem.
Napadá mě ještě varianta s načtením všech hodnot do pole a jejich následní zpracování v php, ale myslím si že vyběr konkrétních přímo dotazem je lepší.
Děkuji za reakce.
tiso
Profil
jednoducho - z dátumu a času si poskladáš unix timestamp, v PHP si vyrátaš koľko je to tvoje "n", vynásobíš ho intervalom medzi meraniami (1 minúta = 60 sekúnd) a potom si vytvoríš dotaz:
select ... from ... group by ceil(time_stamp/n*60) where ...
Vikes
Profil
tiso:
Děkuji za rekaci,
ale nějak se nechytam. Můžeš to popsat blíže? Myslel jsem že by šel napsat cykl do selectu. Něco ve smyslu co je u LOOP, ITERATE, LEAVE na stránkách http://weboveaplikace.info/2009/07/14/ridici-struktury-v-mysql/
Šlo by to použít?
Alphard
Profil
Vikes:
Nemá být výběr složitější, nebo výsledek nějak počítat?
Ve chvíli, kdy budete prohlížet dlouhé období a jeden krok přeskočí 10 hodin (budou se porovnávat teploty z úplně jiných částí dne), bude přesnost výsledku docela pofidérní.

tiso výsledek seskupuje podle kroků na základě času. Zaokrouhlený timestamp dělený konstantou vytvoří určitou množinu opakujících se čísel. Když podle nich výsledek seskupíte, bude mít výběr po krocích.
Vikes
Profil
Děkuji za reakci,
máte pravdu, pokud přeskočím např 10 hod, tak měření má velice malou vypovídající hodnotu. Bylo by třeba možné počítat 10 min průměry a ty pak vypisovat. Nebo můžu interval logování také prodloužit, či omezit maximální rozsah výběru datumů. Varianta podle tisa se mi líbí, ale tak nějak nevím jak se toho uchopit. Můžete mi to prosím popsat detailněni.
Děkuji


Na obrázku je náhled současné zkušební verze.
Alphard
Profil
Pro delší časové úseky je deset minut podle mě málo. Kdybyste to bral po půl hodině, tak pro vykreslení grafu teplot za měsíc budete mít cca 1500 hodnot, podle mě dostatečných.
Vytvořte si druhou tabulku, tam si spočítejte ty hodnoty a z ní berte data pro velké grafy. Když bude někdo chtít detailní informace např. za dva dny, použíjte původní podrobnou tabulku.
S konkrétním řešením výpočtu můžeme pomoci, ale napište, kterou variantu chcete použít, ať neztrácíme čas.
Vikes
Profil
Bylo by možné časový interval měnit podle počtu dnů mezi zadanými datumy. A např ho omezit, pokud by krok byl moc velký. K Vaší variantě: je tedy výhodnější vytvářet např. dočasnou tabulku s mezivýpočty a nebo si načíst sadu hodnot z db a v php si vybrat potřebné hodnoty?

Můžete mi tedy nastínit variantu jak vybírat (pro půl hodinové měření - 10 hodnot) udělat jejich průměr a ukládat je do další tabulky i s datem a časem pro celý rozsah vybraných hodnot?
Kajman_
Profil *
V tisově příspěvku dáte v group by za n 30. Díky funkcím avg(teplota), min(teplota), max(teplota) získáte na takto seskupených hodnotách za ty jednotlivé půlhodiny průměry, minima a maxima.

Do jiné tabulky může data dostat díky sytaxi
insert into souctova_tabulka (teplota_avg,teplota_min,teplota_max,cas) 
select avg(teplota), min(teplota), max(teplota),FROM_UNIXTIME(ceil(UNIX_TIMESTAMP(cas)/(30*60)))
group by ceil(UNIX_TIMESTAMP(cas)/(30*60))
where cas>'posledni-ulozeny-cas'

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