Otsikko oli hankala keksiä ilman, että se olisi ollut kilometrin pituinen. Mutta asiaan...
On taulukko, jossa on vaihtuva määrä mittatuloksia. Näistä mittatuloksista tehdään SQL-kyselyitä erilaisilla tarkkuuksilla. Ensimmäinen tarkkuus on tulokset suoraan sellaisinaan (helppoa). Seuraavaksi pitäisi saada tuloksista kolmen peräkkäisen tuloksen keskiarvo yhtenä arvona, eli jos mittatuloksia on 300, niin kyselyn tulos antaisi 100 tulosta. Ensimmäisellä rivillä olisi siis keskiarvo arvoista 1-3, toisella arvoista 4-6, kolmannella 7-9 jne... Tarkoitus olisi siis skaalata arvojen esitystarkkuutta, kun tavoitetaan joku tietty määrä mittatuloksia.
Eli ongelma on se, että pystyykö tuon keskiarvojen laskemisen suorittamaan yhdellä kyselyllä, vai pitääkö jokainen keskiarvo kysellä erikseen ja sitten esittää tulokset jotenkin muuten yhdessä?
Kökköratkaisu voisi olla esim näin:
select '1-3', avg(arvo) from aputaulu
where rivi >=1 and rivi <=3
union
select '4-6', avg(arvo) from aputaulu
where rivi >=4 and rivi <=6
jne
jos mittaustulosten määrä on etukäteen tiedosssa. Tai jos mahdollista niin teet pikkuohjelman ymärille jolla luuppaat nuo rivit ja muutat sql:n aina sopivaksi. Lopputulokset voi tallettaa sitten sopivaan paikkaan.
eli about näin :
select count(1) into mittaulustuloksia from aputaulu
for n= 1 to mittaulustuloksia
select avg(arvo) into from aputaulu
where rivi >=n and rivi <=n+2
talleta tulokset tässä
n=n+3
next
Tuloksia on muuttuva määrä ja skaalauksen (eli kuinka monesta tuloksesta lasketaan keskiarvo) päättää käyttäjä. Tuloksista piirretään kuvaajaa VB:n puolella, mihin tarvitsen näitä tuloksia, joten helpompaa olisi, jos tulokset saisi yhdellä kyselyllä ilman mitään looppeja ja useiden peräkkäisten kyselyiden härdelliä.
Tämä toimii ainakin Oracle 9:ssä :
select rivi , eka
from (
select rownum rivi,
avg( arvo) over(order by rivi asc rows between current row and 2 following ) eka
, ceil((rownum+2)/3) - ((rownum + 2) / 3 ) jako
from aputaulu)
where jako=0
Aihe on jo aika vanha, joten et voi enää vastata siihen.