Ik heb een database 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?
Ja, maar wel een beetje laat ;-)
Pas nadat Pg Vincent er een opmerking over had gemaakt.

Het is overigens geen 'aanval' mijnerzijds, maar meer bedoeld als stimulans om soms even verder te vragen op het moment dat een vraagstelling riekt naar een vreemde achterliggende gedachte.
Ik durf bijna niet te reageren...

Database voorbeeld
Week1 Datum1 Jaar1 Week2 Datum2 KlantID
201640 2016-10-05 2016 201702 2017-01-11 2
201640 2016-10-05 2016 201602 2016-01-13 2

SELECT avg(week(datum1)),avg(week(datum2)) WHERE Jaar1 = '2016' AND KlantID='2' GROUP BY Jaar1

Wat de bedoeling is om het 'gemiddelde' (misschien is gemiddelde niet het juiste woord maar hoe zou je het anders moeten noemen) te krijgen van de week 1 velden en de week 2 velden, maar wel over het jaar genomen. Ik krijg nu een gemiddelde waarde maar ik wil een 'jaar weeknummer' (201605) terug krijgen.



ah
er zitten dus ook nog 2 datums/weken in 1 record. En daarvan wil je het gemiddelde hebben?

SELECT ROUND((Week1 + Week2) /2) FROM tabel WHERE YEAR(datum1) = 2016 AND klantID = 2

Niet dat ik snap op wat voor manier dit getal bruikbaar is.

201601 + 201603 = 403204
dat delen door 2 levert 201602

Maar
201552 + 201601 levert 403153
delen door 2 levert je 201577

Als jij er iets mee kunt, prima.

Maar zoals al gesteld: het zou handig zijn om voor de reageerders op z'n minst een poging te doen om te antwoorden op de vraag wat je hier in hemelsnaam mee moet....
"Ik durf bijna niet te reageren..."

:-) gewoon doen, anders krijg je nooit een goed antwoord.


"Wat de bedoeling is om het 'gemiddelde' (misschien is gemiddelde niet het juiste woord maar hoe zou je het anders moeten noemen)"

En daar zit het probleem; ik kan me geen beeld vormen van wat je bedoelt met "gemiddelde week". Een weeknummer is een datum en zoals anderen al hebben uitgelegd is een gemiddelde datum feitelijk een loze kreet. Je vraagt immers eigenlijk gewoon wat het gemiddelde is van "maandag,woensdag en donderdag", of "wat is het gemiddelde van parijs en londen"? Je kunt wel vragen om het gemiddelde aantal inwoners van prijs en londen, en je kunt vragen om het gemiddelde aantal verkochtte bioscoopkaartjes op maandag, woensdag en donderdag, maar "het gemiddelde van twee weken" zegt mij (en de rest) niets. En daarom vermoed ik dat je ergens een denkfoutje maakt...


Kun je een concreet voorbeeld geven van de brondata die je hebt en de uitslag die je wilt krijgen? (mag verzonnen data zijn uiteraard, als het maar de vorm heeft die je gebruikt) en dan ook graag een uitleg van waar je die data voor gebruikt?

en is je gewenste 201605 puur een voorbeeld van het formaat? Want hoe je van 201640 en 201702 op 201605 wilt uitkomen, is mij een raadsel.

----
Zo maar een idee he.
Stel dat het achterliggende probleem is, dat je een oplossing zoekt voor "op welke datum stuur ik een mailtje aan de klant dat het project halverwege is?"

Dan zou je moeten weten wat de lengte van de periode is tussen de 2 datums (in dagen.
Deel die waarde door 2 en tel dat op bij de begindatum.

Dan heb je een nieuwe datum. En daarvan bepaal je het weeknummer.

Dus

SELECT ROUND(DATEDIFF(datum1, datum2) /2);  -- midden van de periode

SELECT datum1 + INTERVAL ROUND(DATEDIFF(datum1, datum2) /2) DAY ; -- de datum van die dag

SELECT YEARWEEK(datum1 + INTERVAL ROUND(DATEDIFF(datum1, datum2) /2) DAY); -- het weeknummer van die datum




Voorbeeld
Database voorbeeld
Week1 Datum1 Jaar1 Week2 Datum2 KlantID
201601 2016-01-06 2016 201623 2016-06-08 28
201602 2016-01-13 2016 201627 2016-07-06 28

Stap 1
GEM (2016-01-06+2016-01-13)2016-01-9.5 --> gemiddelde datum1 --> 2016-01-09 (1 september 2016 =201635)

Stap 2
GEM (2016-06-08+2016-07-06)= 2016-06-12 --> gemiddelde datum2 12 juni 2016 = 201623 (deze datum is even gegokt.


Het gaat er dus om dat de query een 'gemiddelde' datum1 terug geeft van datum1. En voorkeur in de vorm van een weeknummer.

Hetzelfde was de bedoeling van datum2.

De gegevens groepeer ik overigens via een group by. Zie mijn eerdere antwoorden






Owkee... en wat geeft die gemiddelde datum dan volgens jou weer?
Piet, kun je uitleggen wat Datum1 en Datum2 zijn? Als Datum1 bijvoorbeeld een factuurdatum en Datum2 een betaaldatum is of als Datum1 een besteldatum en Datum2 een leverdatum is, dan is duidelijker wat je probeert te bereiken. (Kolomnamen met een volgnummer gebruiken is meestal geen goed idee; gebruik liever betekenisvollere namen.)

Bedenk verder dat het verschil tussen twee datums geen datum is, maar een interval of een periode in ISO-termen. Denk bij de vorige gevallen bijvoorbeeld aan een betaaltermijn en een levertermijn. Dit verschil zie je in PHP bijvoorbeeld terug in de klassen DateTime en DateInterval. Dat komt misschien van pas als je niet de "gemiddelde datum" maar meer de gemiddelde afwijking van een datum zoekt.
Zoals mijn voorgangers al zeggen ...

Leg eens in Jip-en-Janneke-taal uit wat datum 1 en datum 2 zijn?

Wat gebeurt er op datum 1, en wat gebeurt er op datum 2?

En wat gebeurt en volgens jou in die "gemiddelde week" die jij probeert uit te rekenen?
Datum 1 is de inkoopdag/inkoopweek

Datum 2 is de afleverdag/afleverweek


Wat we willen is de gemiddelde inkoopdag (dus alle dagen opgeteld en dan het gemiddelde hieruit teruggeven in de SQL query) en exact hetzelfde met de gemiddelde afleverdag.

En dan uitrekenen wat het verschil is (in weken). Ze kunnen dan zeggen in periode 1 duurt het gemiddeld 20 weken maar in periode 2 duurt het gemiddeld 14 weken. En over een jaar genomen duurt het gemiddeld 18 weken


Ze werken bij ons met de tijdnotitie 201601 als week 1 of 201640 als week 40 van het jaar 2016.

Reageren