好久都没写东西了,最近遇到一些东东,本来以前都想过解决方法,但今天没有办法,也就解决的.....
呵呵;
最近在更改PMIS台账信息:
比如变电器的台账,本来是根据变压器的新增时间作为统计时间,但是如果有一个月变压器没有新增,那么这个月的台账信息就没有,但事实上这个月的台账有是自从新增台账的第一条记录到之个月为止的所有条数;
解决方法:
整体过程(其实是ETL过程):TRUNCATE 两个目标表中数据---->整合所有设备类型的的月度新增信息到一个表中---> 建一个所以所有表维度的笛卡尔积的表--->建一个过程将新笛卡尔积表(注意:台账的开始时间)的数据理添加到刚才新增的表(注意粒度问题)--->通过SUM() OVER (PARTITON BY ORDER BY ) 得到每个月的台账信息,
1.根据需加做所有设备类型的台账信息添加到一个表中;
2.以上操作会有一个问题,会造成如果没有任何维度在该月录入,那么在该月统计的信息就到的;为了解决该办法,我们要新建一个维度笛卡尔积如下:
CREATE TABLE Dim_ChangeDev AS
SELECT dept_id,dept_name,dev_id,dev_name,runs_id,runs_name,svolc_id,svolc_name FROM
(SELECT fid as dept_id,fdisplayname as dept_name FROM dim_dept WHERE eclass=4) a,
(SELECT devtype as dev_id,devtypename as dev_name FROM dim_devtype WHERE devtype in ('165','166','167','168','170','172','173','175','176','185','186'))b,
(SELECT scode as runs_id,srunstate as runs_name FROM dim_runstate WHERE scode in ('01','02','03','04'))c,
(SELECT sid as svolc_id,svolclass as svolc_name FROM dim_volclass)d;
然后根据以上的信息,运行过程,使数据到方便的抽到“目标数据表1”中:
使用数据表中的最早时间与系统时间循环输入时间,以全部补充0,不管有没有数据;
CREATE OR REPLACE PROCEDURE Pro_ChangeDev
IS
v_beginDate DATE;
BEGIN
SELECT MIN(to_date(ed_year||'-'||ed_month||'-1','YYYY-MM-DD')) INTO v_beginDate FROM AO_SBBDTJ WHERE ed_year is not null;
WHILE v_beginDate <= sysdate LOOP
INSERT INTO ao_sbbdtj SELECT dev_id,0,0,to_char(v_beginDate,'YYYY'),to_char(v_beginDate,'MM'),dept_id,runs_id,NULL,dev_id FROM dim_changedev;
COMMIT;
SELECT ADD_MONTHS(v_beginDate,1) INTO v_beginDate FROM dual;
END LOOP;
END;
3.运行以上过程将数据添加到一个抽取后的表中;然后再用别外一个查询语句:SUM() OVER (PARTITION BY ORDER BY )子句统计信息把数据从“目标数据表1”中插到“目标数据表2”中,这个一个到目前每个月的统计信息都不会放过的;---这里不要在PARTTION BY 中写入YEAR,MONTH,因为这样跨年就不进行累加的;