我需要做一些非常奇怪的事情,那就是创建虚假记录 , 以填补产品价格发布日期之间的空白。
实际上,我的情况比这要复杂一些,但是我已经简化为产品/日期/价格。
假设我们有此表:
create table PRICES_TEST ( PRICE_DATE date not null, PRODUCT varchar2(13) not null, PRICE number ); alter table PRICES_TEST add constraint PRICES_TEST_PK primary key (PRICE_DATE, PRODUCT);
有了这些记录:
insert into PRICES_TEST values (date'2012-04-15', 'Screw Driver', 13); insert into PRICES_TEST values (date'2012-04-18', 'Screw Driver', 15); insert into PRICES_TEST values (date'2012-04-13', 'Hammer', 10); insert into PRICES_TEST values (date'2012-04-16', 'Hammer', 15); insert into PRICES_TEST values (date'2012-04-19', 'Hammer', 17);
选择记录将向我返回以下内容:
PRICE_DATE PRODUCT PRICE ------------------------- ------------- ---------------------- 13-Apr-2012 00:00:00 Hammer 10 16-Apr-2012 00:00:00 Hammer 15 19-Apr-2012 00:00:00 Hammer 17 15-Apr-2012 00:00:00 Screw Driver 13 18-Apr-2012 00:00:00 Screw Driver 15
假设今天是2012年4月21日,我需要 一个视图 , 该视图 将每天重复每个价格,直到发布新价格为止。像这样:
PRICE_DATE PRODUCT PRICE ------------------------- ------------- ---------------------- 13-Apr-2012 00:00:00 Hammer 10 14-Apr-2012 00:00:00 Hammer 10 15-Apr-2012 00:00:00 Hammer 10 16-Apr-2012 00:00:00 Hammer 15 17-Apr-2012 00:00:00 Hammer 15 18-Apr-2012 00:00:00 Hammer 15 19-Apr-2012 00:00:00 Hammer 17 20-Apr-2012 00:00:00 Hammer 17 21-Apr-2012 00:00:00 Hammer 17 15-Apr-2012 00:00:00 Screw Driver 13 16-Apr-2012 00:00:00 Screw Driver 13 17-Apr-2012 00:00:00 Screw Driver 13 18-Apr-2012 00:00:00 Screw Driver 15 19-Apr-2012 00:00:00 Screw Driver 15 20-Apr-2012 00:00:00 Screw Driver 15 21-Apr-2012 00:00:00 Screw Driver 15
任何想法如何做到这一点?我 不能 真正使用其他辅助表,触发器或PL / SQL编程,我确实需要使用 view 来做到这一点。
我认为可以使用Oracle Analytics(分析)完成此操作,但我对此并不熟悉。我尝试阅读此http://www.club- oracle.com/articles/analytic-functions-i-introduction-164/,但我一无所获。
我认为我有一个解决方案,使用增量方法来实现CTE的最终结果:
with mindate as ( select min(price_date) as mindate from PRICES_TEST ) ,dates as ( select mindate.mindate + row_number() over (order by 1) - 1 as thedate from mindate, dual d connect by level <= floor(SYSDATE - mindate.mindate) + 1 ) ,productdates as ( select p.product, d.thedate from (select distinct product from PRICES_TEST) p, dates d ) ,ranges as ( select pd.product, pd.thedate, (select max(PRICE_DATE) from PRICES_TEST p2 where p2.product = pd.product and p2.PRICE_DATE <= pd.thedate) as mindate from productdates pd ) select r.thedate, r.product, p.price from ranges r inner join PRICES_TEST p on r.mindate = p.price_date and r.product = p.product order by r.product, r.thedate
mindate
dates
productdates
ranges
inner join
演示:http : //www.sqlfiddle.com/#!4/ e528f/ 126