ITPub博客

首页 > 数据库 > Oracle > 依据前后数据关联关系,生成多行数据

依据前后数据关联关系,生成多行数据

原创 Oracle 作者:pwz1688 时间:2014-03-06 21:43:39 0 删除 编辑
例:一张表的数据如下,第一个字段是日期,第二个字段是数字 
ROW DATE NUMBER
1 2014-02-01 4
2 2014-02-08 3
3 2014-02-15 4
4 2014-02-22 9
现在需要写一个查询,显示出的结果是7号以前的的值是4,8号到14号的值是3,15号到21号的值是4,21号到当前日期的值是9。
方法1:
分析:要生成的数据,日期非常有规律,以一个星期为界限,可以构造一个序列,0-6,然后已有日期+序列,作为新生成的日期,
完整sql代码如下:
SQL> edit
已写入 file afiedt.buf
  1 with t1 as(
  2 select date'2014-02-01' dt,4 num from dual union all
  3 select date'2014-02-08',3 from dual union all
  4 select date'2014-02-15',4 from dual union all
  5 select date'2014-02-22',9 from dual),
  6 t2 as(select level-1 l from dual connect by
  7 level<=7)
  8* select t1.dt+l,num from t1,t2 order by 1
  9 /
T1.DT+L NUM
-------------- ----------
01-2月 -14 4
02-2月 -14 4
03-2月 -14 4
04-2月 -14 4
05-2月 -14 4
06-2月 -14 4
07-2月 -14 4
08-2月 -14 3
09-2月 -14 3
10-2月 -14 3
11-2月 -14 3
T1.DT+L NUM
-------------- ----------
12-2月 -14 3
13-2月 -14 3
14-2月 -14 3
15-2月 -14 4
16-2月 -14 4
17-2月 -14 4
18-2月 -14 4
19-2月 -14 4
20-2月 -14 4
21-2月 -14 4
22-2月 -14 9
T1.DT+L NUM
-------------- ----------
23-2月 -14 9
24-2月 -14 9
25-2月 -14 9
26-2月 -14 9
27-2月 -14 9
28-2月 -14 9
已选择28行。
方法2:
先构造一个日期表,然后与此表left join,再利用last_value( ignore nulls)生成num字段数据,完整代码如下:
SQL> edit
已写入 file afiedt.buf
  1 with t1 as
  2 (select date '2014-02-01' dt, 4 num
  3 from dual
  4 union all
  5 select date '2014-02-08', 3
  6 from dual
  7 union all
  8 select date '2014-02-15', 4
  9 from dual
 10 union all
 11 select date '2014-02-22', 9 from dual),
 12 t2 as
 13 (select date '2014-02-01' + level - 1 dt
 14 from dual
 15 connect by level <=
 16 TO_NUMBER(TO_CHAR(LAST_DAY(TO_DATE('201402', 'YYYYMM')), 'dd')))
 17 select t2.dt, last_value(num ignore nulls) over(order by t2.dt) num
 18 from t2
 19 left join t1
 20* on (t1.dt = t2.dt)
SQL> /
DT NUM
-------------- ----------
01-2月 -14 4
02-2月 -14 4
03-2月 -14 4
04-2月 -14 4
05-2月 -14 4
06-2月 -14 4
07-2月 -14 4
08-2月 -14 3
09-2月 -14 3
10-2月 -14 3
11-2月 -14 3
DT NUM
-------------- ----------
12-2月 -14 3
13-2月 -14 3
14-2月 -14 3
15-2月 -14 4
16-2月 -14 4
17-2月 -14 4
18-2月 -14 4
19-2月 -14 4
20-2月 -14 4
21-2月 -14 4
22-2月 -14 9
DT NUM
-------------- ----------
23-2月 -14 9
24-2月 -14 9
25-2月 -14 9
26-2月 -14 9
27-2月 -14 9
28-2月 -14 9
已选择28行。
SQL> 

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

下一篇: 数据库范式详解
请登录后发表评论 登录
全部评论

注册时间:2009-03-30

  • 博文量
    106
  • 访问量
    736027