Databáze > MySQL

Vybrat hodnoty se zadaným časovým rozestupem

(1/2) > >>

hlucheucho:
mám tabulku naměřených teplot (sloupce cas DateTime a teplota float). Do ní je při měření každou sekundu zapsána nová naměřená hodnota. Z této tabulky potřebuji vybrat naměřené hodnoty za zadané období navíc jen ty, které mají mezi sebou zadaný rozestup, např. pokud byl rozestup zadán 5s, vybere se první hodnota s datem a časem rovným zadanému počátku období a každá další bude mít datum a čas vyšší o 5s než předešlá.

Zatím jsem to zkusil tak, že jsem udělal uloženou proceduru, která podle zadaného období a rozestupu vytvoří dočasnou tabulku časů a pak vyberu z tabulky neměřených hodnot požadované.
--- Kód: ---/*
Vytvoří dočasnou tabulku 'casy' s časy od '2014-04-11 11:23:00' do '2014-04-11 11:26:00' s rozestupem časů 5s
*/
call vzorkovani('2014-04-11 11:23:00', '2014-04-11 11:26:00', 5);

/*
Přečte naměřené hodnoty za zadané období se zadaným rozestupem
*/
select cas, teplota from leva_teploty where cas in (select cas from casy);
--- Konec kódu ---

Potřebuji aby i select z tabulky naměřených hodnot byl uvnitř procedury, při tom aby při volání procedury bylo možné zvolit tabulku a sloupce. Jak na to?

hu

pf1957:
Nepises:

- jak moc mas ekvidistantni vzorky a jak se to ma chovat, kdyz se objevi nejake nepravidelnosti napr. cas t+5 s nebude existovat (ale napr. az t+6  a  dalsi vzorek vudci nemu t+4) apod.
- co je to za DB

hlucheucho:
Databáze překvapivě MySQL   :D  ver. 5.6. Výběr v čase nejbližšího vzorku jsem eliminoval vzorkováním 1 vzorek za sekundu a zaokrouhlením času na celé sekundy při vkládání vzorku do DB. Čas zapisovaný do DB spolu s hodnotou generuje měřící systém. Za této situace by nepravidelnosti mohli vzniknout jen při výpadku měřícího systému. Nenaměřená data by neměla být k dispozici a neměla by být "samovolně" nahrazována nejbližší naměřenou hodnotou nebo hodnotou odvozenou od nejbližších naměřených hodnot.

Další problém naráží na nároky na strojový čas. Testoval jsem to v prostředí MySQL Worbench na vzorku asi 1000 hodnot. Provedení uložené procedury pro vytvoření dočasné tabulky pro asi 40 časů trvá kolem 1s :( Výběr samotných naměřených hodnot proběhl pod 20ms, což vyhovuje.

hu

hlucheucho:
Jde to mnohem jednodušeji a bez uložené procedury:

--- Kód: ---select cas, teplota from leva_teploty where
 (cas between '2014-04-11 11:21' and '2014-04-11 11:31')
 and mod(cas - unix_timestamp('2014-04-11 11:21'), 5) = 0;
--- Konec kódu ---

vybere od 11:21:00 do 11:31:00 hodnoty s rozestupem 5s. Sloupec cas je timestamp.

hu

Daniel_Andrascik:
jak elegantne, ale len pokial tam mas vzdy ulozene piate skeundy (0, 5, 10, 15... atd), zalezi jak presne a dochvilne ukladas, pises ze ukladas kazdu sekundu, len ci sa sem tam v dosledku kadejakej okolitej rezie nestane ze dojde k ulozeniu hodnot 4,9s a potom az 6,1s a zaznam s piatou sekundou je fuc. No niekedy pre statisticke prehlady, pripadne pre vykreslovanie grafu nemusi nejaky ten strateny zaznam vadit.

Navigace

[0] Seznam témat

[#] Další strana

Přejít na plnou verzi