GROUP BY dle datetime?

Karel Zak zakkr na zf.jcu.cz
Čtvrtek Leden 18 23:30:16 CET 2001


On Thu, 18 Jan 2001, Ing. Pavel PaJaSoft Janousek wrote:

> 	Zdravim,
> 
> 	resim takovyto problem (dotaz mozna na Karla Zaka, ale treba i ostatni
> budou mit dobre napady, za ktere predem dekuji):
> 
> Mam tabulku, kde se kazdou hodinu pro X uzivatelu storuji nejaka data...
> a ja z techto dat potrebuji urcite statistiky. Zajimavym faktem je
> (zjisteno empiricky), ze data pro tech X uzivatelu nejprve insertnu a
> teprve pak dam commit (nelibi se mi to, ale jak vcera psal do
> Pgsql-bugs na ... jinak to zatim nejde:-()- vzhledem k tomu, ze jedna bunka
> je definovana jako "cas datetime default 'now'" (kde 'now' by mel byt
> deferencovany cas provadeni transakce) neni tomu tak, je to cas, kdy
> provadim COMMIT (jinak by vsechny radky plnene danou hodinu mely tezko
> porad stejny cas - inserty dohromady se neprovedou v ramci 1 sekundy).
> Ale zpet...

 Nejak jsem jsem tento "bug-report" na Pgsql-bugs@ prehledl (hodne
veci ctu klavesou delete :-(. Kazdopadne je my jasne co bude odpoved.
To neni bug, to je feature.... now() == cas transakce

> je mi zcela jasne, ze pri 'rucnym' pristupu jsem si z DB schopen
> spocitat cokoli, ja bych vsak rad z mnoha duvodu maximum prace prenesl
> na back-end...

 Tak to mam take radeji :-)
 
> Zajima mne tedy jak napr. formulovat tyto dotazy, abych dostal korektni
> vysledky (uvazujme, ze tabulka ma zhruba takovouto strukturu: create
> table a(user int, udaj int, cas datetime default 'now'); a ze se kazdou
> hodinu provadi X (X>1) insertu, ktere v tuto chvili maji vzdy shodny
> 'cas' v ramci hodiny (ale do budoucna nepochybne mit asi nebudou))
> 1. Prumerny (maximalni, minimalni apod.) 'udaj' za urcity den (24 hodin)
> pro urciteho uzivatele
> 2. Prumerny (maximalni, minimalni apod.) 'udaj' za urcity den (24 hodin)
> pro vsechny uzivatele dohromady
> 3. Soucet udaju o vsech uzivatelich v ramci 1 hodiny (nejlepe za 24
> hodin s krokem 1 hodina - tedy na vystupu 24 radku)
> 
> 	Napadaji mne dalsi dotazy, ale pokud je pres GROUP BY (ci jinym
> podobnym pristupem (nebo mi navrhnete jiny ktery odpovida ANSI SQL))
> mozne konstruovat tyto dotazy a nekdo mi je prozradi (tim mi ukaze, jak
> v techto pripadech datetime pouzit) jak, zbytek si uz mozna odvodim sam
> a nebude treba marnit cas ostatnich...

 Za prve 'datetime' to zavani PostgreSQL < 7.0 :-((((, "my" uz tomu ted
rikame 'timestamp'.


 Pokud ty propocty vystaci s count(), avg() apod... tak to GROUP BY slo.


test=# select * from x;
 num |           t
-----+------------------------
   1 | 2001-01-19 17:27:49+01
   1 | 2001-01-19 18:27:49+01
   5 | 2001-01-19 18:27:49+01
  50 | 2001-01-19 17:27:49+01
  50 | 2001-01-19 17:27:49+01
  57 | 2001-01-19 15:00:49+01


Po hodinach:

test=# select date_part('hour', t) as "per hour", count(num), avg(num) from
x group by date_part('hour', t);

 per hour | count |      avg
----------+-------+---------------
       15 |     1 | 57.0000000000
       17 |     3 | 33.6666666667
       18 |     2 |  3.0000000000
(3 rows)


Pochopitelne je jen zalezitosti "spolecneho" prvku, ktery nejakou funkci
z toho casu bude vytazen a pouzit na grouvani. Rekl bych, ze pouzitim napr.
to_char() na misto date_part() bude jen veci fantazie co bude ten spolecny
prvek.

 Nebo tam mel byt problem, ktery jsem prehledl?

					Karel





Další informace o konferenci Test