如上图,需求描述如下:
数据库表product_price中存放这产品(product)的价格(price)修改记录,其中每条记录有使用该价格的起止时间(beginDate 和 endDate),每次修改价格,都将前一价格的endDate写为新价格的beginDate,新价格的endDate为空。现在给定时间段,1、将价格有修改的日期列出来,并将该日期下所有产品的最新价格列出来,即有修改的列出修改后的,没修改的列出之前的最新价格。(图中红色代表价格调高,绿色调低)
2、每月1号无论是否修改价格,将所有产品的最新价格列出来。求教这样的需求如何实现?或者可以写出这样的中间表吗?
小弟在线等,望不吝赐教!
数据库表product_price中存放这产品(product)的价格(price)修改记录,其中每条记录有使用该价格的起止时间(beginDate 和 endDate),每次修改价格,都将前一价格的endDate写为新价格的beginDate,新价格的endDate为空。现在给定时间段,1、将价格有修改的日期列出来,并将该日期下所有产品的最新价格列出来,即有修改的列出修改后的,没修改的列出之前的最新价格。(图中红色代表价格调高,绿色调低)
2、每月1号无论是否修改价格,将所有产品的最新价格列出来。求教这样的需求如何实现?或者可以写出这样的中间表吗?
小弟在线等,望不吝赐教!
解决方案 »
- 查看某个表的所有字段的数据类型、长度?
- ★★100分,为什么建了索引的效果不明显?★★
- 有没有什么好的工具来分析sql语句的性能?
- oracle9i安装时报交换空间不足
- 用PB怎么把SYBASE数据库数据导出来?或者怎么把Sybase数据库数据导入到oracle数据中?
- 求助 触发器!
- 我对创建trigger 语句中出现的referencing old as old new as new for each row不太理解,old 和new 各表示何意??
- 关于PL/SQL写的存储过程的问题
- 关于导入导出的存储过程!
- PL/SQL Developer13查询无输出
- 关于dblink产生事务的问题
- 很简单一个存储过程,目的是想在第一条语句触发异常后,继续执行下面语句,不知道如何实现这样的功能。
另外:每次修改价格,都将前一价格的endDate写为新价格的beginDate,新价格的endDate为空。这个每次修改时应该是insert 一条记录吧?
(
p_id varchar2(20),
price number,
begdate varchar2(20),
enddate varchar2(20)
);insert into TEST_A (P_ID, PRICE, BEGDATE, ENDDATE)
values ('a', 300, '2011-03-06', '2011-03-10');
insert into TEST_A (P_ID, PRICE, BEGDATE, ENDDATE)
values ('a', 200, '2011-03-10', '2011-03-12');
insert into TEST_A (P_ID, PRICE, BEGDATE, ENDDATE)
values ('a', 300, '2011-03-12', null);
insert into TEST_A (P_ID, PRICE, BEGDATE, ENDDATE)
values ('b', 100, '2011-03-07', '2011-03-10');
insert into TEST_A (P_ID, PRICE, BEGDATE, ENDDATE)
values ('b', 200, '2011-03-10', '2011-03-15');
insert into TEST_A (P_ID, PRICE, BEGDATE, ENDDATE)
values ('b', 300, '2011-03-15', '2011-03-25');
insert into TEST_A (P_ID, PRICE, BEGDATE, ENDDATE)
values ('b', 350, '2011-03-25', null);
insert into TEST_A (P_ID, PRICE, BEGDATE, ENDDATE)
values ('c', 100, '2011-03-07', '2011-03-09');
insert into TEST_A (P_ID, PRICE, BEGDATE, ENDDATE)
values ('d', 200, '2011-03-10', '2011-03-11');
insert into TEST_A (P_ID, PRICE, BEGDATE, ENDDATE)
values ('d', 300, '2011-03-11', '2011-03-30');
insert into TEST_A (P_ID, PRICE, BEGDATE, ENDDATE)
values ('d', 350, '2011-03-30', null);
insert into TEST_A (P_ID, PRICE, BEGDATE, ENDDATE)
values ('c', 120, '2011-03-09', null);
commit;declare
v_sql varchar2(4000):='select p_id, ';
begin
for x in(select distinct enddate from test_a t where enddate>'2011-03-09' and enddate is not null order by enddate)
loop
v_sql:=v_sql||'NVL((select price from test_a where p_id=t.p_id and begdate='''||x.enddate||'''),
(select distinct first_value(price) over(order by BEGDATE desc) from test_a where p_id=t.p_id and begdate<'''||x.enddate||''')),';
end loop;
v_sql:=v_sql||'from (select distinct p_id from test_a) t';
dbms_output.put_line(v_sql);
end;