ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 按列求积

按列求积

原创 Linux操作系统 作者:lsmnlsmn 时间:2012-07-19 22:11:46 0 删除 编辑

问题描述:

A表以SECCODEDATE为主键,有如下纪录:
SECCODE DATE FACTOR
6000 2007-7-18 0.9958
6000 2008-4-24 0.7656
6000 2009-6-9 0.7090
6000 2010-6-10 0.7632
6000 2011-6-3 0.7600
6000 2012-6-26 0.9640

B
表以SECCODEDATE为主键,有如下纪录
SECCODE DATE PRICE
6000 2008-4-01 15
6000 2008-4-12 16
6000 2009-4-12 17
6000 2011-4-12 13
6000 2012-4-12 16

现在要做的事情是:
取出A表与BSECCODE相同的纪录,取出DATE字段,与B表的DATE字段进行比较,B表中DATE所有小于A表取出的DATE的纪录,做如下处理:PRICE*FACTOR
举个例子:
对于B表中的6000 2009-4-12 17纪录,
因为A表中有
6000 2009-6-9 0.7090
6000 2010-6-10 0.7632
6000 2011-6-3 0.7600
6000 2012-6-26 0.9640
4
条记录的DATE大于2009-4-12,所以B表的PRICE做的处理是:17*0.7090*0.7632*0.7600*0.9640

 

暂且抛开正题,说点久远的东西。这个东西,当我们熟悉它的时候,不知道它能干啥;当我们见了它倍感陌生时,才知道原来它可以这么用。这个熟悉而陌生的东西就是对数,其身份特征如下:

(1) a0a1b0,則有唯一的實數x滿足axb。此時x稱為“a為底數,b的對
  ,並記做xloga b,其中b叫做真數a叫做底數有時我們也把loga b叫做對數式
(2)
 xloga b axb(即ab)。

性質1loga xyloga xloga y

性質2loga loga xloga y
性質3loga xrr loga x

 

重新认识了对数,我们可以切入正题了。

首先创建表及插入数据。

create table a (

 seccode number(12),

 a_date date,

 factor number(6,4)

);

 

create table b (

 seccode number(12),

 b_date date,

 price number(12)

);

 

insert into a values(6000,to_date('2007-07-18','yyyy-mm-dd'),0.9958);

insert into a values(6000,to_date('2008-04-24','yyyy-mm-dd'),0.7656);

insert into a values(6000,to_date('2009-06-09','yyyy-mm-dd'),0.7090);

insert into a values(6000,to_date('2010-06-10','yyyy-mm-dd'),0.7632);

insert into a values(6000,to_date('2011-06-03','yyyy-mm-dd'),0.7600);

insert into a values(6000,to_date('2012-06-26','yyyy-mm-dd'),0.9640);

 

insert into b values(6000,to_date('2008-04-01','yyyy-mm-dd'),15);

insert into b values(6000,to_date('2008-04-12','yyyy-mm-dd'),16);

insert into b values(6000,to_date('2009-04-12','yyyy-mm-dd'),17);

insert into b values(6000,to_date('2011-04-12','yyyy-mm-dd'),13);

insert into b values(6000,to_date('2012-04-12','yyyy-mm-dd'),16);

 

对于上面的问题,很容易想到下面的结构:

select b.price * (select ?

                    from a

                   where a.a_date > b.b_date)

  from b;

即对于表B中的每一行,找出A表中日期A_DATE大于B_DATE的所有行。但上述结构中B.PRICE只能跟一个值相乘,而不能跟一个多行的结果集相乘,怎么办呢?下面巧妙的使用对数实现了列相乘。

 

select b.price * (select power(10, sum(log(10, a.factor)))

                    from a

                   where a.a_date > b.b_date)

  from b;

对比本篇开始处的对数定义,您一定已经轻松理解这个实现啦。

最后,可以根据需要进行有效位截取。另外为了整洁大方,记得为复杂列起个别名。

select trunc(b.price * (select power(10, sum(log(10, a.factor)))

                    from a

                   where a.a_date > b.b_date),2) as result

  from b;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24867611/viewspace-736085/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-07-12

  • 博文量
    16
  • 访问量
    19729