AVG berekeningen
datum(date), tijd(TIME), naam(varchar15), bezigheid (int4).
Voor de duidelijkheid 'bezigheid' is hoe lang een persoon met iets bezig is in minuten. in Time staan alleen uren, minuten en seconden staan altijd op 0
wat ik nu eigenlijk wil is deze formule kunnen doen in een query:
Bezigheid = (1xgemiddelde bezigheid +3xgemiddelde bezigheid gisteren + 2xgemiddelde bezigheid gisteren) /4.6
Gemiddelde bezigheid wordt niet berekend door elke bezigheidswaarde per dag op te tellen / 24 maar het wordt op deze manier uitgerekend:
gemiddelde = (MAX(bezigheid) + MIN(bezigheid)) / 2
Het is misschien een vreemde manier van rekenen maar heb daar zo me redenen voor.
Nu het probleem is eigenlijk, ik heb geen idee hoe ik dit moet aanpakken. Ik ben nog niet echt HEEL diep ingegaan op mysql dus denk dat ik veel functies niet ken. Dit was het idee waar ik op ben gekomen maar weet niet of het makkelijker of beter kan:
Ik dacht eerst een view maken die de gemiddelde per dag heeft. dus een view als dit
CREATE VIEW daggemiddeld AS SELECT datum,(MAX(bezigheid) + MIN(bezigheid)) / 2 as daggemiddelde FROM bezigheidstabel;
Maar heel eerlijk gezegd kom ik qua ideen even niet verder dan dit. Ben op dit moment wat meer sql documentatie aan het lezen maar kom echt niet verder over hoe ik de rest van me formule moet gaan uitrekenen. Als een SQL expert mij verder kan helpen is mijn dank hiervoor groot :)
Paul R op 10/08/2010 11:35:37:
Bedankt voor de reactie maar zover was ook ongeveer gekomen wat ik wil is eigenlijk meer iets in deze trend:
formule:
Bezigheid = (1xgemiddelde bezigheid +3xgemiddelde bezigheid gisteren + 2xgemiddelde bezigheid gisteren) /4.6
SELECT (AVG(bezigheid)van vandaag + 3xAVG(bezigheid) van gisteren + 2xAVG(bezigheid) eergisteren) / 4.6 as bezigheid FROM tabel group by datum;
Alleen de 2 punten waar ik mee zit zijn eigenlijk:
AVG(bezigheid) kan ik niet gebruiken omdat die het gemiddelde anders berekend dan ik wil (ik wil dat hij het berekend als gemiddeld = (MAX(bezigheid) + MIN(bezigheid)) /2
en tweede punt is eigenlijk hoe krijg ik waarde van verschillende dagen in 1 query (als dat al mogelijk is)- dus de gemiddelde bezigheid, van gisteren, eergisteren en vandaag in 1 query. Ik denk dat ik het in combinatie met PHP wel zou kunnen doen maar zou graag weten of het ook in een query kan :P. Zit nu zelf een beetje te zoeken of het mogelijk is om variabelen aan te maken in sql zodat het misschien zo zou kunnen werken:
Eerst een view maken met alle gemiddelden van de dag (bezigheidView) en dan zoiets:
@vandaag = Select gemiddelde from bezigheidView where datum = 20100810
@gister = Select gemiddelde from bezigheidView where datum = 20100810 - 1
@eergister = Select gemiddelde from bezigheidView where datum = 20100810 - 2
SELECT (@vandaag + 3x@gister + 2x@eergister)/4.6 as uitkomst;
maar als ik dit probeer krijg ik een syntaxerror. Ik hoop dat mijn probleem nu duidelijk is :P?
Maak het zelf af en kleur de plaatjes ;-)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
select a.vandaag,
b.gister,
c.eergister,
a.medewerkernr,
b.medewerkernr,
c.medewerkernr
from (select formule_voor(vandaag) as vandaag, medewerkernr
from bezigheden
where datum = now()
) a
(select formule_voor(gisteren) as gisteren, medewerkernr
from bezigheden
where datum = now()-1
) b
(select formule_voor(eergisteren) as eergisteren, medewerkernr
from bezigheden
where datum = now()-2
) c
where a.medewerkernr=b.medewerkernr
and a.medewerkernr=c.medewerkernr
b.gister,
c.eergister,
a.medewerkernr,
b.medewerkernr,
c.medewerkernr
from (select formule_voor(vandaag) as vandaag, medewerkernr
from bezigheden
where datum = now()
) a
(select formule_voor(gisteren) as gisteren, medewerkernr
from bezigheden
where datum = now()-1
) b
(select formule_voor(eergisteren) as eergisteren, medewerkernr
from bezigheden
where datum = now()-2
) c
where a.medewerkernr=b.medewerkernr
and a.medewerkernr=c.medewerkernr
Gewijzigd op 10/08/2010 13:01:50 door John D
misschien een korte reactie hierop (ben nu aan het zoeken naar nested selects, wist niet dat zoiets bestond dus misschien kom ik het zo tegen) maar waarom staat dat where a.medewerkernr = b.medewerkernr daar? Ik heb zeg maar geen medewerkernummer in de tabel staan. De primary key in de tabel is een combinatie van datum + tijd. Dus zou ik dat er dan van moeten maken?
Gewijzigd op 10/08/2010 14:20:48 door ama saril
Ama saril op 10/08/2010 14:18:52:
Bedankt alvast :)
misschien een korte reactie hierop (ben nu aan het zoeken naar nested selects, wist niet dat zoiets bestond dus misschien kom ik het zo tegen) maar waarom staat dat where a.medewerkernr = b.medewerkernr daar? Ik heb zeg maar geen medewerkernummer in de tabel staan. De primary key in de tabel is een combinatie van datum + tijd. Dus zou ik dat er dan van moeten maken?
misschien een korte reactie hierop (ben nu aan het zoeken naar nested selects, wist niet dat zoiets bestond dus misschien kom ik het zo tegen) maar waarom staat dat where a.medewerkernr = b.medewerkernr daar? Ik heb zeg maar geen medewerkernummer in de tabel staan. De primary key in de tabel is een combinatie van datum + tijd. Dus zou ik dat er dan van moeten maken?
je moet een manier vinden om de drie geneste selects te "verbinden". Ik doe dat dus in het voorbeeld op medewerkernr maar het kan op datum, naam, soort bezigheid, maakt niet uit. In plaats van zoeken op nested selects kan je ook zoeken op: in-line views
Gewijzigd op 10/08/2010 15:36:59 door John D
Hartstikke bedankt probleem is opgelost. Zal morgen de query posten als ik weer achter me pc zit met de oplossing :)