2012-05-25 8 views
0

Учитывая эту таблицу:Создать график с пересекающимися датами

CREATE TABLE positions 
    ( "EMP_ID" CHAR(10 BYTE), 
    "GTYPE" NUMBER, 
    "AMT" NUMBER, 
    "START_DATE" DATE, 
    "STOP_DATE" DATE 
    ) 

и эти данные:

Insert Into positions (Emp_Id,Gtype,Amt,Start_Date,Stop_Date) 
    select 'XA0022',1,1000,'01-MAY-2010','08-MAY-2012' from dual union 
    Select 'XA0022',1,1000,'01-MAY-2010','31-DEC-2012' From Dual Union 
    Select 'XA0022',2,500,'03-APR-2012','15-JUL-2012' From Dual Union 
    Select 'XA0022',1,421,'01-MAY-2012','23-MAY-2012' From Dual Union 
    Select 'XA0022',1,1514,'09-MAY-2012','31-DEC-2012' From Dual union 
    select 'XA0022',1,600,'24-MAY-2012','24-MAY-2012' from dual; 

Как получить это:

from   to   type1 type2 
    01-May-2010 02-Apr-2012  2000 0 
    03-Apr-2012 30-Apr-2012  2000 500 
    01-May-2012 07-May-2012  2421 500 
    08-May-2012 08-May-2012  2421 500 
    09-May-2012 22-May-2012  2935 500 
    23-May-2012 23-May-2012  2935 500 
    24-May-2012 15-Jul-2012  3114 500 
    16-Jul-2012 31-Dec-2012  3014 0 

Примечание: Сумма действует на start_date и не действует на следующий день после stop_date.

Любые указатели с благодарностью получили!

+0

Можете ли вы экстраполировать немного больше? Я не понимаю, как в него играют type1, type2. – Nick

+0

Я думаю, что type1, type2 не самый сложный бит. Что я имею в качестве исходных данных является таблица с датой начала и окончания с количеством Некоторые из них даты начала/остановки перекрываться Что мне нужно, чтобы быть в состоянии вывести это общая сумма для каждого типа, который находится в каждый раз, когда позиция начинается или останавливается. Думайте об этом как о временной линии. С 01 мая 2010 года по 02-апр-12 всего типа1 = 2000, type2 = 0 Это связано с тем, что начиная с 01 мая-10 существует 2 типа типа 1, но это изменяется на 03 апреля- 12 как type2, поэтому тип 1 = 2000, type2 = 0 заканчивается в предыдущий день 02-апр-12 – lidbanger

+0

Я думаю, что это псевдо-код того, что я хочу (игнорируя теперь свойство type1,2) 'code' случай, когда минимум ((following_rows.start_date-1), following_rows.end_date) между current_row.start_date и current_row.stop_date то мере ((following_rows.start_date-1), following_rows.end_date) еще current_row.end_date конец ' code' Я не могу получить окно раздела для работы, поскольку я хочу или сделать различие между текущей ro w и следующие строки. – lidbanger

ответ

0

Используйте шарнир Oracle.

Oracle Pivot

select * from 
(select emp_id, gtype, amt, start_date, stop_date 
from positions) 
pivot (sum(amt) as amt for (gtype) in (1 as "TYPE1", 2 as "TYPE2")) 
order by emp_id, start_date; 

С еще некоторая информация (спасибо), что-то вроде этого?

select emp_id, gtype, start_date, 
case when next_amt <> amt then next_start_date -1 end as to_date 
from 
(select emp_id, gtype, start_date, amt, 
lead(start_date,1) over (order by emp_id, start_date) next_start_date, 
lead(amt,1) over (order by emp_id, start_date) next_amt 
from 
positions) 
+0

Не совсем. Мне нужно получить временную шкалу с датой начала, остановки с суммой, действующей между этими двумя датами. сравните первую строку желаемого результата с исходной датой, которая начинается с 01 мая 2010 года. – lidbanger