Autor Téma: Vybrat hodnoty se zadaným časovým rozestupem  (Přečteno 2368 krát)

Offline hlucheucho

  • Plnoletý
  • ***
  • Příspěvků: 196
  • Karma: 2
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: [Vybrat]
/*
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);

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

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1700
  • Karma: 70
    • Verze Delphi: D2007, XE3, DX10
Re:Vybrat hodnoty se zadaným časovým rozestupem
« Odpověď #1 kdy: 28-04-2014, 19:23:30 »
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

Offline hlucheucho

  • Plnoletý
  • ***
  • Příspěvků: 196
  • Karma: 2
Re:Vybrat hodnoty se zadaným časovým rozestupem
« Odpověď #2 kdy: 28-04-2014, 20:18:51 »
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
« Poslední změna: 28-04-2014, 20:23:01 od hlucheucho »

Offline hlucheucho

  • Plnoletý
  • ***
  • Příspěvků: 196
  • Karma: 2
Re:Vybrat hodnoty se zadaným časovým rozestupem
« Odpověď #3 kdy: 30-04-2014, 15:26:27 »
Jde to mnohem jednodušeji a bez uložené procedury:
Kód: [Vybrat]
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;

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

hu

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 397
  • Karma: 15
    • Verze Delphi: D2007, XE3
Re:Vybrat hodnoty se zadaným časovým rozestupem
« Odpověď #4 kdy: 30-04-2014, 16:54:20 »
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.

Offline hlucheucho

  • Plnoletý
  • ***
  • Příspěvků: 196
  • Karma: 2
Re:Vybrat hodnoty se zadaným časovým rozestupem
« Odpověď #5 kdy: 30-04-2014, 17:02:39 »
desetiny sekundy jsou eliminovány zaokrouhlením času na celé sekundy jak bylo uvedeno výše, takže časy jsou striktně po celých sekundách vyjma poruch kdy hodnota zcela chybí

hu

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 397
  • Karma: 15
    • Verze Delphi: D2007, XE3
Re:Vybrat hodnoty se zadaným časovým rozestupem
« Odpověď #6 kdy: 01-05-2014, 00:36:40 »
no ved na to som upozornoval, ale asi som mal uviest priklad 4,4 a 6,1. Potom by 5ka naozaj chybala, ale ako hovorim, niekkedy sem tam chybajuci udaj nesposobuje problem...

Offline hlucheucho

  • Plnoletý
  • ***
  • Příspěvků: 196
  • Karma: 2
Re:Vybrat hodnoty se zadaným časovým rozestupem
« Odpověď #7 kdy: 01-05-2014, 12:33:54 »
Vhodným technickým opatřením lze tak velké odchylky ve vzorkování vyloučit. S trochou nadsázky: není důležité kolik je hodin, důležité je, jaký čas do DB měřící systém zapíše spolu s naměřenou hodnotou.

hu

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 397
  • Karma: 15
    • Verze Delphi: D2007, XE3
Re:Vybrat hodnoty se zadaným časovým rozestupem
« Odpověď #8 kdy: 01-05-2014, 15:18:04 »
isteze, rieseni je viacero, ja som so svojim prispevkom chcel len uistit ci si si tychto problemov vedomy, nebola to kritika ani navrh riesenia. Uz sa mi neraz stalo ze to co mi vo vyvojovych podmienkach pekne fungovalo, tak zacalo blbnut az ked sa to nasadilo u zakaznika prave preto ze som prehliadol tieto komplikacie ktore prinasa "realny svet". Ale je vidiet ze nad tym rozmyslas, a to je presne to preco som prispel do tohto vlakna ;) 

Offline hlucheucho

  • Plnoletý
  • ***
  • Příspěvků: 196
  • Karma: 2
Re:Vybrat hodnoty se zadaným časovým rozestupem
« Odpověď #9 kdy: 01-05-2014, 15:39:03 »
Oceňuji snahu předejít problémům.

hu

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Datový typ v Delphi, který má True a False: