阿里云
发表主题 回复主题
  • 622阅读
  • 9回复

[急急急]oracle有没有个功能可以从数据库表中取出数据然后通过计算然后创建一个新表?

级别: 论坛版主
发帖
41
云币
72



各位朋友:


最近在处理一个项目,需要根据一个已存在的表(自动更新),然后创建一个统计表,目前有根据这个思路写java代码,但是速度很慢(源数据1亿数据量),



我想请教下各位:oracle有没有个功能可以从一个数据库表中取出数据然后通过计算然后创建一个新表?



我在网上有查可以写储存过程,函数,游标等等,没有一个类似的示例,能否请各位朋友帮忙写个示例,我仿照着来写。



源数据库的数据模拟如下:


序号        日期        A

50201281        2016-08-01        0.00

50201281        2016-08-02        0.00

50201281        2016-08-03        0.00

50201281        2016-08-04        0.00

50201281        2016-08-05        0.00

50201281        2016-08-06        0.00

50201281        2016-08-07        0.00

50201281        2016-08-08        0.00

50201281        2016-08-09        0.00

50201281        2016-08-10        0.00

50201281        2016-08-11        0.00

50201281        2016-08-12        0.00

50201281        2016-08-13        0.00

50201281        2016-08-14        0.00

50201281        2016-08-15        0.00

50201281        2016-08-16        0.00

50201281        2016-08-17        0.00

50201281        2016-08-18        0.00

50201281        2016-08-19        0.00
[急急急]oracle有没有个功能可以从数据库表中取出数据然后通过计算然后创建一个新表?-oracle创建数据库




需要得到的表如下:


序号        月        日        A的平均值        开始年份        结束年份        间隔年份        备注        修改时间

50201281        8        4        0.00        2016        2016        1        null        2016-10-31 10:04:15

50201281        8        1        0.00        2016        2016        1        null        2016-10-31 10:04:16

50201281        8        9        0.00        2016        2016        1        null        2016-10-31 10:04:16

50201281        8        10        0.00        2016        2016        1        null        2016-10-31 10:04:16

50201281        8        19        0.00        2016        2016        1        null        2016-10-31 10:04:16

50201281        8        6        0.00        2016        2016        1        null        2016-10-31 10:04:16

50201281        8        7        0.00        2016        2016        1        null        2016-10-31 10:04:16

50201281        8        3        0.00        2016        2016        1        null        2016-10-31 10:04:16

50201281        8        5        0.00        2016        2016        1        null        2016-10-31 10:04:16

50201281        8        18        0.00        2016        2016        1        null        2016-10-31 10:04:16

50201281        8        2        0.00        2016        2016        1        null        2016-10-31 10:04:16

50201281        8        16        0.00        2016        2016        1        null        2016-10-31 10:04:16

50201281        8        17        0.00        2016        2016        1        null        2016-10-31 10:04:16

50201281        8        13        0.00        2016        2016        1        null        2016-10-31 10:04:16

50201281        8        11        0.00        2016        2016        1        null        2016-10-31 10:04:16

50201281        8        14        0.00        2016        2016        1        null        2016-10-31 10:04:17

50201281        8        8        0.00        2016        2016        1        null        2016-10-31 10:04:17

50201281        8        12        0.00        2016        2016        1        null        2016-10-31 10:04:17

50201281        8        15        0.00        2016        2016        1        null        2016-10-31 10:04:17
[急急急]oracle有没有个功能可以从数据库表中取出数据然后通过计算然后创建一个新表?-oracle数据库创建用户



计算方式:

目标表:序号取于源表

月:取源表 日期中的月

日:取源表 日期中的日

A的平均值:取源表中当月当日所有年份的A的值/年份间隔

开始年份:取源表中最开始的年

结束年份:取源表最后的年

间隔年份: 最后年-最开始的年

修改之间:我执行的时间

creat table:

  1. create table "target"(


  2.         "序号" CHAR(8) not null,


  3.        "月" NUMBER(2) not null,


  4.        "日" NUMBER(2) not null,


  5.        "A均值" NUMBER(5,1),


  6.        "开始年份" NUMBER(4),


  7.        "结束年份" NUMBER(4),


  8.        "间隔年份" NUMBER(4),


  9.        "备注" VARCHAR2(200),


  10.        "修改时间" DATE,


  11.         constraint "target" primary key ("序号","月","日")


复制代码

insert 语句 :


目前还不知道怎么写,我把java里面写的sql语句贴出来吧:

  1. sql1: select 序号 from Original table; <font color="#ff0000">获取源数据表所有的序号</font>




  2. sql2:  select distinct to_char(日期,'mm-dd') from Original table where 日期='上面获取的具体序号'"    <font color="#ff0000">获取单个序号里面日期的月和日</font>




  3. sql3:A的平均值,min(to_char(日期, 'yyyy')),max(to_char(日期, 'yyyy')),count(distinct to_char(日期, 'yyyy')),sysdate from Original table where 序号 = '具体序号' and to_char(日期, 'mm-dd') = '具体日期'     <span style="line-height: 1.5;"><font color="#ff0000">获取单个序号,单个月和日内的,A平均值,开始年份,介绍年份,间隔年份,执行时间</font></span>


复制代码然后不停的写入数据库。。。我试了java写入,写一次用了22个小时,就是想问下oracle是否有相类似的功能实现,



谢谢各位帮忙了!!!如果表述不清楚,可以跟帖,谢谢!!!


最佳答案



[急急急]oracle有没有个功能可以从数据库表中取出数据然后通过计算然后创建一个新表?-oracle创建数据库实例 lhqmccn

查看完整内容


--直接将查询结果建表,

CREATE TABLE test2 AS
SELECT id 序号,
to_char(dates, 'mm') 月,
to_char(dates, 'dd') 日,
AVG(a) a均值,
MIN(to_char(dates, 'YYYY')) 开始年份,
MAX(to_char(dates, 'YYYY')) 结束年份,
MAX(to_char(dates, 'YYYY')) - MIN(to_char(dates, 'YYYY')) 间隔年份,
' ' 备注,
SYSDATE 修改时间
FROM test
GROUP BY id, to_ch ...










级别: *
发帖
*
云币
*




你好!

源表只有第一个A值有用,b,c,d,e对计算没有影响;

统计表的年月日都是取自于 源表的时间,中间的A表平均值是自己计算的
级别: *
发帖
*
云币
*




版主你好!

源数据是每天更新的,比如今天是2016-10-28号,A的数据会增加5万条。

那么10月28日的平均值得重新计算,这样说不知道您明白没。
级别: *
发帖
*
云币
*


A、b、c、d、e字段的意思没说,结果中的月、日也跟源数据对不上,至少都要说明下
级别: *
发帖
*
云币
*




--直接将查询结果建表,


CREATE TABLE test2 AS

SELECT id 序号,

       to_char(dates, 'mm') 月,

       to_char(dates, 'dd') 日,

       AVG(a) a均值,

       MIN(to_char(dates, 'YYYY')) 开始年份,

       MAX(to_char(dates, 'YYYY')) 结束年份,

       MAX(to_char(dates, 'YYYY')) - MIN(to_char(dates, 'YYYY')) 间隔年份,

       ' ' 备注,

       SYSDATE 修改时间

  FROM test

GROUP BY id, to_char(dates, 'mm'), to_char(dates, 'dd')

ORDER BY id, to_char(dates, 'mm'), to_char(dates, 'dd')

级别: *
发帖
*
云币
*


详细说明一下结果是如何得到的
级别: *
发帖
*
云币
*


直接分组求平均值不可以吗?我看着怎么感觉像分组求平均值呢
级别: *
发帖
*
云币
*


如果大部分是历史数据根本就不应该每次都算
级别: *
发帖
*
云币
*




其他日子又不变,就更新一条就够了
级别: *
发帖
*
云币
*




版主你好:

结果是计算出来的,

源数据库里有5000多个序号,分别是123456789,123456790.。等;

时间有1950-1-1,1950-2-1等;

A的值有1,2,3,等


结果是取 序号,比如123456789:

然后取时间,比如1月1号,会搜到很多年份的比如:1950,1951,1952等

计算A的平均值就是 很多1月1号的A值相加 然后 除以 年份的个数;比如(1+2+3)/(1950到1952=3年)=2


发表主题 回复主题
« 返回列表
«12345678910»
共10页
上一主题下一主题

限100 字节
批量上传需要先选择文件,再选择上传
 
验证问题: 23 + 54 = ?
上一个 下一个
      ×
      全新阿里云开发者社区, 去探索开发者的新世界吧!
      一站式的体验,更多的精彩!
      通过下面领域大门,一起探索新的技术世界吧~ (点击图标进入)

      版权声明

      开发者论坛为你提供“[急急急]oracle有没有个功能可以从数据库表中取出数据然后通过计算然后创建一个新表?”的内容,论坛中还有更多关于 修改开始时间结束时间截取图片序号从0开始最近的时间间隔时间,间隔,自动计算增加序号 的内容供你使用,该内容是网友上传,与开发者论坛无关,如果需要删除请联系zixun-group@service.aliyun.com,工作人员会在5个工作日内回复您。