日期:2014-05-16  浏览次数:20358 次

将“稀疏数据”变成“稠密数据”的思路

在做项目时我遇到了这样的一个问题:

  财务给我们的数据并不是每天都有的,由于财务人员并不是每天都记账,造成数据不是连续性。例如:“应收账款”表中的数据为。2012年1月1日 有数据;然后就到2012年3月2日出现第二条数据。这样就造成我们数据之间有间隔。

我们想要的数据形式为,即使没有发生交易,在财务那里应该将交易额记为0,但现实情况不是这样。解决这样的情况思路为:

 

   1、准备一个全时间的,时间维表。这样保证时间是连续的。(如下图)

select * from T99_DT_CD

  2、 对时间补全的事实表进行处理。将事实表中的所有维度全部总结出来,准备于时间维表进行笛卡尔积的处理。

select distinct unitcode,unitname,bproperty,igrade,ywxcode,ywxname,pronum,province from table_事实表  .   需要distinct 的处理。

3、出来的结果作为表,与时间维表进行笛卡尔积。如下

 

select b.unitcode,b.unitname,substr(a.stat_dt,1,4)
,case when substr(a.stat_dt,6,1) = '0' then substr(a.stat_dt,7,1) else substr(a.stat_dt,6,2) end,a.stat_dt||' 00:00:00'
,b.bproperty,b.igrade,b.ywxcode,b.ywxname,b.pronum,b.province,0,0
from
(select distinct unitcode,unitname,bproperty,igrade
,ywxcode
,ywxname,pronum,province
from V_YSZKJC_20110901) b,
(select stat_dt from pdata_dev..T99_DT_CD
where current_dt >= '20110101' and current_dt<CURRENT_TIMESTAMP) a

这时要注意 指标字段先写死为0数据。

4、这时将得出来的结果插入到一个临时表中,这个临时表中的数据就是事实表中,全部维度下全部时间的数据了。

5、将事实表中的真实数据在插入到这个临时表中,按照所有维度进行 group by 。指标字段sum()的方法,就能就数据合并到一起了,能合并是数据都是有发生额。这样既能将没有发生数据的日期补充完成,又能保证数据的准确。