If given the Average for 24 hours for each date in a year. I want to spread this hourly average to average at each minute. e.g. given
Date Time Average
01-Jan-15 23:00 20
02-Jan-15 00:00 50
02-Jan-15 01:00 30
I want the output to be calculated something as below ....
DateTime AVG_VALUE
01/01/2015 23:00:00 20
01/01/2015 23:01:00 20.5
01/01/2015 23:02:00 21
01/01/2015 23:03:00 21.5
01/01/2015 23:04:00 22
01/01/2015 23:05:00 22.5
01/01/2015 23:06:00 23
01/01/2015 23:07:00 23.5
01/01/2015 23:08:00 24
01/01/2015 23:09:00 24.5
01/01/2015 23:10:00 25
01/01/2015 23:11:00 25.5
01/01/2015 23:12:00 26
01/01/2015 23:13:00 26.5
01/01/2015 23:14:00 27
01/01/2015 23:15:00 27.5
01/01/2015 23:16:00 28
01/01/2015 23:17:00 28.5
01/01/2015 23:18:00 29
01/01/2015 23:19:00 29.5
01/01/2015 23:20:00 30
01/01/2015 23:21:00 30.5
01/01/2015 23:22:00 31
01/01/2015 23:23:00 31.5
01/01/2015 23:24:00 32
01/01/2015 23:25:00 32.5
01/01/2015 23:26:00 33
01/01/2015 23:27:00 33.5
01/01/2015 23:28:00 34
01/01/2015 23:29:00 34.5
01/01/2015 23:30:00 35
01/01/2015 23:31:00 35.5
01/01/2015 23:32:00 36
01/01/2015 23:33:00 36.5
01/01/2015 23:34:00 37
01/01/2015 23:35:00 37.5
01/01/2015 23:36:00 38
01/01/2015 23:37:00 38.5
01/01/2015 23:38:00 39
01/01/2015 23:39:00 39.5
01/01/2015 23:40:00 40
01/01/2015 23:41:00 40.5
01/01/2015 23:42:00 41
01/01/2015 23:43:00 41.5
01/01/2015 23:44:00 42
01/01/2015 23:45:00 42.5
01/01/2015 23:46:00 43
01/01/2015 23:47:00 43.5
01/01/2015 23:48:00 44
01/01/2015 23:49:00 44.5
01/01/2015 23:50:00 45
01/01/2015 23:51:00 45.5
01/01/2015 23:52:00 46
01/01/2015 23:53:00 46.5
01/01/2015 23:54:00 47
01/01/2015 23:55:00 47.5
01/01/2015 23:56:00 48
01/01/2015 23:57:00 48.5
01/01/2015 23:58:00 49
01/01/2015 23:59:00 49.5
02/01/2015 50
02/01/2015 00:01:00 49.66666667
02/01/2015 00:02:00 49.33333333
02/01/2015 00:03:00 49
02/01/2015 00:04:00 48.66666667
02/01/2015 00:05:00 48.33333333
The idea is to get the smooth incline or decline graph between two interval. In the output you can see the avg is gradually increasing with increasing minutes as we move from 20->50
Can this be achived using Oracle Query or some PL/SQL code?
You can use this query and change the hours to minutes. It works with any interval and will not fail on daylight savings days if this is a problem for you in your area.
This query returns Time of Max and Time of min, you can remove all of this in the final select statement.
In Oracle 11g how do you time weight average data hourly between two dates?
You can use recursive subquery factoring to do the interval halving, and find the weighted average (or whatever this calculation is supposed to be finding) for each step:
The anchor member gets the initial half-hour slot and the next period's average value, via
lead()
, and uses those to calculate the initial (20+50)/2 etc.:The recursive member then repeats that process but with the previous step's period length and calculated average. I've now made it stop when it reaches the last minute in the period.
So that gives you the intermediate result set:
You can then use another recursive CTE, or I think more simply a
connect by
clause, to expand each of those steps into the appropriate number of minutes, each with the same 'average' value:Which gives you:
EDIT: Added union to include the final missing row
Some thing like this may work. Assuming the input data is in table a,