Portál AbcLinuxu, 14. května 2025 05:38

Dotaz: Statisticke zpracovani casove posoupnosti udalosti - PostgreSQL

10.4.2012 19:44 fedy
Statisticke zpracovani casove posoupnosti udalosti - PostgreSQL
Přečteno: 413×
Odpovědět | Admin
Mam tabulku s prehledem udalosti udalosti obsahujici mimo jine sloupce "typ udalosti" a "casova znacka (v msec od epoch)". Nad casovymi znackami je index (B strom). Typ udalosti muze byt mimo jine napr. rozbeh ci zastaveni stroje. Rad bych z teto tabulky vyrobil druhou tabulku (idealne asi spis pohled), ktera by mela obsahovat na radku vzdy statisticke udaje jako je napr. pocet udalosti urciteho typu v danem obdobi (napr. hodina, den, mesic). Potud bez problemu. Trosku obavu mam ale ze sloupce "procentualni vytizeni stroje" ktery by mel udavat procentualne dobu behu stroje v danem obdobi, tedy soucet dob vsech casovych "poduseku" rozbeh-zastaveni stroje. Lze samozrejme resit pomoci vnorenych poddotazu, ale mam obavy o vykon (napr. na usecich delky mesic).

Jak byste takovyto problem resily vy? Ciste pohledy s vnorenym selectem, materializovane pohledy (napr. s vyuzitim stored procedures, triggeru ...) ... ?

P.S. Je vhodnejsi pouzivat pro casovou znacku bigint nebo timestamp? Na bigint se snadno dela modularni aritmetika, ale zas se hur resi letni/zimni cas apod.

Diky za podnety.
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

11.4.2012 19:10 Jirka
Rozbalit Rozbalit vše Re: Statisticke zpracovani casove posoupnosti udalosti - PostgreSQL
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jen nápad.

Kdyby se ti podařilo údaje dostat do formy, kde ke každému startu je i stop. Např. (typ 1=start,2=stop)
id typ cas
 1  1   200
 2  2   210
 3  1   230
 4  2   250
 5  1   300
 6  2   500
Můžeš dobu běhu získat

MAX = SELECT max(id)+1 FROM test

SELECT SUM(IF(t1.typ=2,t1.cas-t2.cas,t2.cas-t1.cas)) as "doba behu" FROM `test` t1 LEFT JOIN `test` t2 ON (t1.id = MAX - t2.id) WHERE t1.id>t2
Josef Kufner avatar 15.4.2012 20:26 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Statisticke zpracovani casove posoupnosti udalosti - PostgreSQL
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jo, řešil jsem něco podobného. Mám tam teď obludný select, který veme všechny časy, přijoinuje události a pak pomocí group by přes čas to posčítá. Je to na prd. Mám tam tisícovku záznamů a ten select trvá pár sekund.

Počítej si statistiky průběžně někam bokem. Při vložení záznamu do tabulky s udalostmi uprav počítadlo pro daný interval. Zobrazení pak bude jen o posčítání či podělení několika čísel.

Timestamp ti automaticky dělá převod z/na letní čas, jinak to vyjde nastejno. Dej si pozor na chování při změně času, aby se ti to nějak blbě nesečetlo.
Hello world ! Segmentation fault (core dumped)
okbob avatar 15.4.2012 20:45 okbob | skóre: 30 | blog: systemakuv_blog | Benešov
Rozbalit Rozbalit vše Re: Statisticke zpracovani casove posoupnosti udalosti - PostgreSQL
Tyhle úlohy se dají docela efektivně řešit buďto přes uložené procedury a kurzory nebo pomocí analytických funkcí - většinou jsou řádově efektivnější než klasická SQL řešení.
Josef Kufner avatar 15.4.2012 20:53 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Statisticke zpracovani casove posoupnosti udalosti - PostgreSQL
Nemáš odkaz na nějaký pěkný příklad nebo článek?
Hello world ! Segmentation fault (core dumped)
okbob avatar 15.4.2012 21:57 okbob | skóre: 30 | blog: systemakuv_blog | Benešov
Rozbalit Rozbalit vše Re: Statisticke zpracovani casove posoupnosti udalosti - PostgreSQL

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.