Functie AVG met weeknummers
voorbeeld
201601
201607
201610
Nu wil ik een gemiddeld weeknummer terug krijgen (1 waarde) Voorbeeld zou ongeveer een waarde van 201606 moeten terug geven.
Nu heb ik de volgende sql query gemaakt. Ik heb de query even simpel gehouden. De orginele query bevat nog wat joins :)
SELECT AVG(weeknummer) FROM Week_Nr_TB
Nu krijg ik wel een gemiddelde week terug alleen ik krijg soms ook waarden terug als 201696 :) Nu is mijn vraag is er een optie in SQL om gelijk het gemiddelde om te rekenen naar een normaal weeknummer?
Alleen het weeknummer gebruiken zonder het jaartal er aan.
Dat zou kunnen alleen we hebben ook weeknummers in 2015, 2016 en in 2017. Maar ik zit even te denken of dit uitmaakt. Ik zou dan de variabele moeten strippen en dan die waarde in de AVG functie moeten stoppen
Maar behalve een weeknummer, zal in de database toch ook wel een datum ingevoerd zijn.
Dan kan je het gemiddelde vinden met :
En dan zoeken naar een jaar met :
Je krijgt dan zoiets :
SELECT SUBSTRING(weeknummer, 5, CHAR_LENGTH(weeknummer) - 0) AS weeknummer_Temp, AVG(weeknummer_Temp) FROM Week_Nr_TB
Ik ben het met je eens 'Adoptive Solution' jaarweek nummer notatie is niet de juiste benaming
Gewijzigd op 14/10/2016 11:49:36 door Piet Knaap
Mocht je geen DATE formaat hebben en teveel moeite vinden om aan te passen:
edit: Je was me net voor :-)
Gewijzigd op 14/10/2016 13:36:14 door Michael -
Wat ik vreemd vind is dat ik ook met SELCT AVG(week(datum)) een getal (bijvoorbeeld 10.8333) terug krijg. Wat ik eigenlijk zoek is een jaarweek (201606 of zo iets) nummer waarde als uitkomst.
Piet Knaap op 14/10/2016 13:04:18:
Wat ik eigenlijk zoek is een jaarweek (201606 of zo iets) nummer waarde als uitkomst.
Dan kun je bijvoorbeeld het jaar vermenigvuldigen met 100 en daar het weeknummer bij optellen. Week 6 in 2016 wordt dan 2016 * 100 + 6 = 201606.
@Ward, wat hij bedoelt is dat hij een gemiddelde week als uitkomst wil. Nu krijg die een gemiddelde van 10.8333 terug maar wil bijv. 201606 terug.
Michael - op 14/10/2016 13:37:09:
@Ward, wat hij bedoelt is dat hij een gemiddelde week als uitkomst wil. Nu krijg die een gemiddelde van 10.8333 terug maar wil bijv. 201606 terug.
Het bovenstaande zoek ik inderdaad Ik wil geen 10.8333 maar 201606 als waarde hebben.....
Als het gemiddelde 10.8 is, neem je het gehele getal = 10 en plak je er 2016 voor.
Vraagje tussendoor: wat is een "gemiddeld weeknummer" in dit geval? Als je weken 1,2,3 en 52 hebt, dan komt het gemiddelde ergens op 10 uit, maar rond die tijd was er nul activiteit, want alles gebeurde in de laatste week van december en de eerste drie weken van januari. Als je tievallig dertig records in week 52 hebt kom je ergens in juni uit, en toen was er in geen velden of wegen enige activiteit te bekennen...
Het probleem waar ik wel tegen aanloop is 201650 en 201702 dan gaat het plakken van een jaartal niet werken.
Toevoeging op 14/10/2016 15:54:19:
Ik heb ondertussen een php functie gevonden die van al mijn weken netjes datums heeft gemaakt. Ik heb nu dus datum. Alleen als ik AVG(week(datum)) uitvoer krijg ik nog steeds een waarde terug....
weeknumner 1
weeknumner 11
weeknumner 35
Som = 47
Gemiddeld 47/3 = 15,66...
Had je iets anders verwacht?
https://www.bennadel.com/blog/175-ask-ben-averaging-date-time-stamps-in-sql.htm
Als je nu alles hebt omgezet naar DATE kun je hiervan het gemiddelde ophalen en vervolgens de week weergeven met WEEK()
Het gemiddelde van kerst en pasen is week 31,5 ergens in de eerste helft van augustus. En nu?
Da' s het leuke van databases. Je kan allerlei niet relevantie informatie ophalen.
"Zoek iedereen die jan heet en waarvan het huisnumner de laatste 2 cijfers van de postcode is"
Alleen de vragensteller weet het belang van de vraag.
Gewijzigd op 14/10/2016 16:39:07 door Adoptive Solution
Dat had je al gezegd, en de vraag daarop was: Welk probleem wil je met dat gemiddelde op te lossen?
Stel dat een reisorganisatie wil weten in welke week mensen gemiddeld op vakantie gaan, dan hebben ze een hoop data over weken 1-4, 20-30 en 45-52. gemiddelde:35. Maar in week 35 gaat dus niemand op vakantie.
Als een supermarkt banketstaven inkoopt op het gemiddelde weeknummer waarin ze die dingen verkopen, dan komen ze uit op weken 1,2,50,51 en 52 gemiddelde: 30. Dus zitten ze in juli al met banketstaven...
En daarom wil ik graag weten waar je dit gemiddelde voor wil gebruiken.
Kom, laat mijn eerste reply op phphulp sinds jaren niet meteeen weer zo een zijn van "ik weet wat ik doe, geef me nou maar gewoon het antwoord dat ik vraagen stel niet van die irrelevante vragen, daar vraag ik toch niet om".
Maar een gemiddelde wordt berekend in het tientallig stelsel.
Dus alsof een jaar 00 tot 99 is 100 weken zou tellen.
(201650+201710)/2=201680.
Zoals San Theo al zei moet je in elk geval alleen de weeknummers nemen.
(50+10)/2=30. Dan klopt het wel.
Als je echter over een reeks van jaren een bepaalde week in een bepaald jaar als uitkomst wilt, lijkt me het gebruik van timestamp(), date() en time() de aangewezen weg. Dan berekent het systeem de datums (jaja, ik weet het), en die kan dat altijd beter. :-) Hoe precies weet ik niet, daar ben ik zelf nog niet aan toe...
Gewijzigd op 16/10/2016 14:00:20 door Paul Ulje
Het valt me op dat er de laatste tijd regelmatig vrij klakkeloos oplossingen worden aangedragen voor vraagstellingen waar je op je minst je vraagtekens bij kunt zetten. Je kan niet een "gemiddelde" week uitrekenen op basis van "omringende" weken. Dat raakt kant noch wal.
Een gemiddelde week kan alleen een week zijn waarin iets gebeurt wat een of ander gemiddelde weerspiegelt. Bijv. in een supermarkt worden per jaar 5.200 maaltijden Babi Pangang verkocht. Vervolgens kun je dan stellen dat dat er per week 100 zijn, en dan kun je kijken in welke week er precies 100 zijn verkocht. Dan heb je een "gemiddelde" week.
Drie weken uit een jaar selecteren en daar vervolgens een gemiddelde uithalen dat kan niet en slaat op de hier genoemde wijze ook nergens op. Het zou enkel ergens op slaan als je er extern gedrag aan koppelt.
Het zou prettig zijn als de vaste kern alvorens tot antwoorden over te gaan (hoe goed bedoeld ook) zich ervan gewist dat de vraagstelling een logische achterliggende gedachte heeft. Zo niet, vraag dan eerst wat de bedoeling van de vraag is, want die is mij tot op heden niet duidelijk.
Ozzie PHP op 16/10/2016 18:07:00:
Het zou prettig zijn als de vaste kern alvorens tot antwoorden over te gaan (hoe goed bedoeld ook) zich ervan gewist dat de vraagstelling een logische achterliggende gedachte heeft.
Lees eens terug: je herhaalt de kanttekeningen die de vaste kern al had geplaatst… ;-)