Oracle 11i - 寻找一个查询,该查询将创建一组日期范围,让 CUSTOM 值覆盖 STANDARD 值,并将 STANDARD 值保留在不被覆盖的位置。
STANDARD
CUSTOMER_ID START_DATE END_DATE VALUE
0001 02/01/2013 09/15/2013 10
CUSTOM
CUSTOMER_ID START_DATE END_DATE VALUE
0001 01/15/2013 03/15/2013 20
0001 07/01/2013 07/31/2013 30
Desired Result
CUSTOMER_ID START_DATE END_DATE VALUE
0001 02/01/2103 03/15/2013 20
0001 03/16/2013 06/30/2013 10
0001 07/01/2013 07/31/2013 30
0001 08/01/2013 09/15/2013 10
以下是试运行的结果:
select sc.customer_id, sc.thedate as start_date,
lead(**sc.thedate**) over (partition by sc.customer_id order by sc.thedate) as end_date,
sc.value
from (select customer_id, start_date as thedate, value
from standard
union all
select customer_id, start_date, value
from custom
union all
select s.customer_id, c.end_date + 1, s.value
from custom c join
standard s
on c.customer_id = s.customer_id
union all
select customer_id, end_date, NULL
from standard
) sc
where value is not NULL;
CUSTOMER_ID START_DATE END_DATE VALUE
0001 15-JAN-13 12.00.00 AM 01-FEB-13 12.00.00 AM 20
0001 01-FEB-13 12.00.00 AM 16-MAR-13 12.00.00 AM 10
0001 16-MAR-13 12.00.00 AM 01-JUL-13 12.00.00 AM 10
0001 01-JUL-13 12.00.00 AM 01-AUG-13 12.00.00 AM 30
0001 01-AUG-13 12.00.00 AM 10