Home » SQL & PL/SQL » SQL & PL/SQL » Merge time duration across data streams based on priority
Merge time duration across data streams based on priority Mon, 13 November 2006 04:54
 Gibson Messages: 1Registered: November 2006 Location: Doncaster, England UK Junior Member
Hello,
I am looking to solve what to me seems an impossible puzzle. I basically want to allocate time duration to the highest priority stream and any time used within the same period by a lower priority is removed from that stream. A is highest priority. I was wondering if anyone could please help me to solve this. I have been researching Analytics but only just beginning to get to grips with that.

9am 10 11 12 1pm 2 3 4
A --------- --------
2:30
B ------------------------- ------------
10:30 1:30
C -------------------- -------

The diagram represents 3 data streams (there are 7 more). Each can generate events that take a period of time during a period from 9am to 5pm. The total 8 hours needs to be allocated across the streams. For example, stream A has an event consuming one hour from 10am to 11 and another from 2 until 3. So the total for stream A would be 2 hours and because this has the highest priority this does not get changed.

I have attached a text file that shows the data layout a bit better.

Now looking at stream B. I need to subtract the time between 10 and 11 and the time from 2 to 2:30 from B. I only subtract from the lower priority the time that the higher priorities overlap. So, I have 9am to 12 giving 3 hours from which I subtract the first A stream hour to leave 2 hours. I then have 1pm to 2:30 giving 1.5 from which I subtract 0.5 hours (the overlap of stream A again) to give 1. The total for stream B is then 2 + 1 = 3 hours.

Stream C requires the same but this time I need to subtract any time from streams A and B that overlap. However this is not the cumulative total just the period.

So, both A and B are have priority at 10:30 and A finishes at 11, however, B continues to 12. This means that C effectively starts at 12 and finishes at 1 which leaves 1 hour to C for the first event. The second event for C is covered completely by stream B and so there is no time allocated to C here. The time in this period is allocated to A and B.

The input data would look something like this

ID STREAM START_DATE END_DATE
1 B 09:00 12:00
2 A 10:00 11:00
3 C 10:30 13:00
4 B 13:00 14:30
5 C 13:30 14:30
6 A 14:00 15:00

And I want to see

Stream Duration (hours)
A 2
B 3
C 1

Can you help?

Yours sincerely,
Gibson
• Attachment: timespan.txt
Re: Merge time duration across data streams based on priority [message #202936 is a reply to message #202913] Mon, 13 November 2006 06:39
 JRowbottom Messages: 5933Registered: June 2006 Location: Sunny North Yorkshire, ho... Senior Member
Is this the sort of thing you're looking for:

This query will take each Start - end pair and count the number of hours in that time that are occupied by jobs with a higher stream.

```create table temp_stream (id  number, stream  varchar2(2), start_Date  number, end_date number);

insert into temp_stream values (1, 'B' ,09 ,12);
insert into temp_stream values (2, 'A' ,10 ,11);
insert into temp_stream values (3, 'C' ,10 ,13);
insert into temp_stream values (4, 'B' ,13 ,14.5);
insert into temp_stream values (5, 'C' ,13.5 ,14.5);
insert into temp_stream values (6, 'A' ,14 ,15);

select id
,stream
,start_date
,end_Date
,(select sum(least(a.end_date,b.end_date) - greatest(b.start_date,a.start_date)) from temp_stream b where b.stream < a.stream and ((b.end_date between a.start_Date and a.end_date) or (b.start_date between a.start_Date and a.end_date))) lost_hours
from   temp_Stream a
order by stream;

ID ST START_DATE   END_DATE LOST_HOURS
---------- -- ---------- ---------- ----------
2 A          10         11
6 A          14         15
1 B           9         12          1
4 B          13       14.5         .5
3 C          10         13          3
5 C        13.5       14.5        1.5```

Am I on the right track?
 Previous Topic: Crypt and Decrypt Fileds Next Topic: select date
Goto Forum:

Current Time: Wed Aug 23 01:21:29 CDT 2017

Total time taken to generate the page: 0.01543 seconds