求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
     
   
分享到
数据仓库开发之路
 
火龙果软件    发布于 2013-9-30
 

数据仓库开发之路之一--准备工作

在数据仓库的开发过程中,需要熟悉大量的概念以及相关工具的使用,还需要了解宏观上的各种开发流程,串联起来完成最终的数据仓库项目的开发,本篇介绍一些准备工作,包括涉及到的工具介绍,以及开发过程的描述,记录学习研究的印记,并和大家讨论研究存在的相关问题。

数据仓库的开发,是完全独立于OLTP系统的,也就是独立于当前各种应用的业务系统而作的分析项目,因此要包含从数据的迁移(提取)、变换、清洗、加载等ETL操作,其中可以分为这么几个数据层。

源数据层

客户的各种业务系统中的数据,如包括企业、车辆和司机信息系统、企业录入数据和及营运等数据,里面存放了大量的事务数据。

ODS数据层

数据库用户ODS数据层主要管理把业务数据层的数据存储到ODS数据层,它的数据表主要就是来源于业务数据表,通过一些存储过程把业务数据表结构改变成基层的数据仓库的表结构。

DW数据层

数据库用户DW主要管理把ODS数据层的数据存储到DW数据层,它的数据表主要就是来源于ODS数据表,通过一些存储过程把ODS数据表结构改变成项目主题数据仓库的表结构。

DW数据层还管理一些对存储过程的记录表,方便数据仓库的维护和管理。

ODS是一个面向主题的、集成的、可变的、当前的细节数据集合,用于支持企业对于即时性的、操作性的、集成的全体信息的需求。常常被作为数据仓库的过渡,也是数据仓库项目的可选项之一。

因此操作数据存储(ODS) 是用于支持企业日常的全局应用的数据集合,ODS的数据具有面向主题、集成的、可变的和数据是当前的或是接近当前的4个基本特征。同样也可以看出ODS是介于DB和DW 之间的一种数据存储技术,和原来面向应用的分散的DB相比,ODS中的数据组织方式和数据仓库(DW)一样也是面向主题的和集成的,所以对进入ODS的数 据也象进入数据仓库的数据一样进行集成处理。另外ODS只是存放当前或接近当前的数据,如果需要的话还可以对ODS中的数据进行增、删和更新等操 作,虽然DW中的数据也是面向主题和集成的,但这些数据一般不进行修改,所以ODS和DW的区别主要体现数据的可变性、当前性、稳定性、汇总度上。

为什么需要有一个ODS系统呢?一般在带有ODS的系统体系结构中,ODS都具备如下几个作用:

1) 在业务系统和数据仓库之间形成一个隔离层。

2) 转移一部分业务系统细节查询的功能。

3) 完成数据仓库中不能完成的一些功能。

这里我们就需要用到了IBM的DataStage工具。 DataStage 是一套专门对多种操作数据源的数据抽取、转换和维护过程进行简化和自动化,并将其输入数据集市或数据仓库目标数据库的集成工具。

DataStage可以从多个不同的业务系统中,从多个平台的数据源中抽取数据,完成转换和清洗,装载到各种系统里面。其中每步都可以在图形化工具里完成,同样可以灵活地被外部系统调度,提供专门的设计工具来设计转换规则和清洗规则等,实现了增量抽取、任务调度等多种复杂而实用的功能。其中简单的数据转换可以通过在界面上拖拉操作和调用一些DataStage预定义转换函数来实现,复杂转换可以通过编写脚本或结合其他语言的扩展来实现,并且DataStage提供调试环境,可以极大提高开发和调试抽取、转换程序的效率。

DataStage是基于客户机/服务器的数据集成架构,优化数据收集,转换和巩固的过程。它提供了一套图形化的客户工具:

包括:Designer(设计者):创建执行数据集成任务Job的同时,对数据流和转换过程创建一个可视化的演示。

Manager(管理者):对每个工程的各个单元,包括:库表定义,集中的数据转换,元数据连接等对象进行分类和组织。

Director(指挥者):为启动,停止,监视作业提供交互式控制。

Administrator(管理者):在服务器端管理DataStage的项目和使用者权限的分配

启动Designer,我们可以在其中创建各种数据复制的Job,然后通过串联起来,完成整个业务数据的定时提取工作,所有工作可以在可视化界面上进行操作,还是比较方便的。

下图是对于不同数据源之间的数据复制过程,中间有一个Transformer的变换对象来处理数据列之间的映射关系的。

下图是串联各种Job对象,组装成一个完成的数据复制流程。

完成上面的业务数据整合复制后,就需要通过编写大量的存储过程,完成从ODS数据层到DW数据仓库层的数据清洗加载操作了,一般我们可以在Pl/Sql Developer中完成相关存储过程的编写,如下图所示:

通过存储过程完成数据从ODS层到DW数据仓库层的转移后,下一步就是要围绕数据仓库的模型做各种应用的分析工作了,这时候就需要用到非常强大的BI工具Business Objects了。

在众多的管理信息系统中一般都应用数据仓库技术,进行数据的统计和分析,而数据仓库的建立、使用、管理及维护等方面都需要工具的支持。有些管理信息系统的业务处理数据库同数据仓库系统一起推广使用,因此大大减少了从业务数据库到数据仓库的数据抽取、集成和转换的复杂程度,但无论数据仓库中数据的来源和抽取方式是什么,对数据仓库的维护、管理、分析、统计都需要用客户端报表/分析工具来完成。在众多的联机分析处理产品中,BO公司的Business Object不失为一个好工具。

Business Object具有以下几个特点:前端分析手段灵活,表现方式多样,语义层构建工具应用面广,应用简单,具有文档管理的数据刷新功能,可以利用资料库对不同用户的操作权限进行管理。

Business Object是一个由多个产品组成的产品族,主要包括Business Object,Designer,Document Agent,Supervisor,Business Miner五个产品。

这几个产品功能如下:

(1)Bupervisor:Supervisor是BO自身的安全管理工具。在Spervisor中可以建立和维护资料库,在资料库中可以建立BO的用户和用户组,通过对不同用户赋予不同的操作权限,来实现对Business Object的使用用户、定制查询(universe)以及查询报告的安全管理。实际上多个用户定制查询及查询结果的共享时通过资料库实现的。

(2)Designer:Designer是一个多编模型构建工具,它可以将关系库中的表通过类、对象及对象明细等工具映射到多维模型的维、维元素及度量指标上,使用户在符合业务逻辑的多维模型上构建查询。

(3)Business Object:Business Object是一个查询定制和统计报表(图形)生成工具。它利用Designer建立多维模型定制各类查询,查询方式包括Business Object定制查询语义层(universe)、手写SQL语句、存储过程及个人数据文件等,在Business Object 4 1版中还将支持OLAP Pannel,从而使其可以利用其他厂商的OLAP服务器的功能。Business Object将查询结果以多种报表形式及统计图形的方式提交给用户。用户可以在查询结果上进行进一步的分析,如向下/向上钻取(Drill Up/Drill Down)等。另外,在Business Object中还提供了一种script语言,?该语言风格类似Visual Basic,在程序中可以以面向对象的编程风格调用Business Object提供的丰富类库。得script语言可以定制出更为友好的查询界面。

(4)Document Agent:Document Agent是专为工作组用户的文档管理及查询结果刷新而建立的。一组用户对应一个Document Agent,不同用户的查询报表(图形)均可发送到Document Agent供同组的其他用户共享。Document Agent还可以定义统计报表(图形)的刷新频度。

在管理机构由于用户的不同使应用角色与工具也不尽相同:
(1)报表设计人员:负责制作固定报表以外的灵活报表,使用工具为BO;负责根据业务需求定制新的固定报表,使用工具为BO Designer;承担前台报表的分发、管理及刷新,使用工具为BO Document Agent。

(2)普通报表用户和高级报表用户:L浏览固定报表,使用工具为BO Reader;浏览报表设计人员设计的灵活报表,使用工作为BO Reader。

(3)数据仓库管理员:完成数据库管理员(DBA)的正常工作;负责数据仓库数据的刷新维护、用户管理等工作,使用工具主要是数据库的管理工具以及BO Supervisor。

通过BO Designer,完成表之间的语义关系的设计以及相关度量、维度的设计,为报表设计奠定基础。

通过BO控制台,启动InfowView,对报表进行相关的设计工作。

完成以上工作后,报表的前端展示其实是比较方便的,可以通过调用BO的报表生成页面就可以了,给报表生成页面附带相关的参数即可,具体的例子可以参考BO自带的很多相关Demo,在此不再赘述。

上述的内容只是我对数据仓库应用的初步了解和认识,纰漏之处难免,随着学习的进行,认识的深入,应用的开展,项目经验的增加,希望更多东西能够明朗化,深入化,坚固化。

数据仓库开发之路之二--概述整个开发流程

在上篇随笔《数据仓库开发之路之一--准备工作》中粗略介绍了一下数据仓库项目应用中涉及到的一些知识和工具,其中涉及到了ETL工具DataStage、BI商务智能工具BO(Business Objects),这两款软件都是一个工具包的集合,包含了很多软件集合的。

数据仓库整体项目流程是一个比较复杂的过程,设计到不少内容,从横向来看,一般可以分为:

1)数据整合层,或者称为操作数据层(ODS),根据项目的需要,可以选用。

2)数据仓库层,也就是所谓的DW层。

3)使用BO的Universe设计的数据库语义层,相关于物理表和报表视图的隔离层。

4)使用BO的Infoview设计报表(如Web Intelligence 报表文档)。

其中1、2是数据准备阶段,3,4是数据应用阶段,准备阶段一般使用ETL工具DataStage和自己编写的各类存储过程来实现,后面的应用阶段,主要使用了BO的套件来完成报表的设计及开发展现等工作。

如一般的横向开发流程示意图如下所示:

在DataStage开发过程中,重头戏是使用DataStage Designer来进行各种任务及任务序列的设计工作,然后利用DataStage Diretor进行相关的调度设计即可。在使用DataStage Designer过程中,总结了一下开发流程,大致如下所示:

1)设计细粒度的复制数据的Server Job,然后串联各类表的Server Job(任务)作为一个主题的Job Sequence(任务序列),最后是串联各主题形成一个大主题的Job Sequence。类似于企业从小组到大部门再到大片区(或更大集权部门)的一种向上集权机制。这样的好处是,我们在调度的时候,只需要调度最大一个Job Sequence即可。

2)建立一个调用存储过程的ETL Job(STP Stage类型),并记录结果。这个ETL Job调用的存储过程就是我们自定义进行数据清理加载到数据库的操作,是指从ODS-》DW的数据操作。

3)串联形成一个完整的数据仓库项目Job,如串联1、2点的相关大主题任务为ODS->ETL。

4)使用Director创建执行时间及周期,这样系统可以自动运行进行相关的调度操作了。

在数据仓库开发设计总,ETL是整个过程的核心灵魂,这里的DataStage做了一部分工作,但是数据的清洗和数据仓库加载的操作还需要自己编写很多存储过程来完成,以便达到灵活处理,方便为何之目的。

这里设计到了数据仓库表、视图等的设计以及存储过程的设计编写操作,因此一般需要遵守好各方面的命名规则及协议,以便达到方便维护管理之目的,各种内容分门别类好,对大量表、视图、存储过程等元数据的管理很有帮助。

这里谈谈ETL设计要点:

1)建立表命名、视图、存储过程等内容的命名规则,如数据表比较多,一般建议采用按用户名Schema的方式来区分不同的数据层,如操作数据层ODS,则可以建立一个ODS的用户Schema来进行管理、数据仓库DW层,则建立DW的用户Schema来进行管理,这样可以在逻辑以及表的命名空间上(物理上)区分不同的内容,实现性能的最大化。如下面是一种规则界定:

1)数据仓库中,表及视图的命名规则:表以T开头,视图以V开头。下滑线后连接数据仓库主题的拼音缩写,如出租主题即为C,客运主题即为K,从业人员主题即为CY,依此类推。表名及视图名称的主体为汉语拼音,前面两个全拼,后面的以开头字母为缩写。例如:出租的车辆基本信息表为T_C_CheLiangJBXX。详见下表。

2)如果表数据比较少或者基于其他原因考虑,也可以考虑通过前缀的方式进行区分,如ODS层的数据,如使用ODS_T_Accuse、ODS_T_QIYEPQ这种方式命名、DW层常用时间维度使用DW_DIM_TIME、事实表采用DW_F_H_YUNLIFENXI来表示,DW业务维度采用DW_D_H_DUNWEI来表示。

3)建立不同的Package来存放不同业务范围的存储过程,如维度可用PKG_LOAD_DIM来命名、时间维度可以用PKG_LOAD_DIM_TIME来命名、事实表可以用PKG_LOAD_FACT_TAXI来命名等,包体里面的存储过程要清晰,附带必要的功能说明,最好在文档的一个表格中详细说明包体及存储过程函数的各种信息,如数据库详细说明那样(PKG是业务定义字母,不同业务用不同的区分)。

4)如果采用不同用户Schema来区分不同的数据层的做法,那么需要为DW层、ODS层指定不同的表空间及存储大小等,以便利用不同物理存储带来的性能方面的提升。

如下面是一个存储过程的组织实例图:

设计好数据仓库的相关内容后,接着就是需要进行另外一个重要的操作,就是语义设计和报表设计了,这两项工作是通过BO工具进行完成,前期的工作都是为后面两步进行准备的。

Universe设计,就是在语义层指定表自己的关系,主题的度量值、维之间的层次关系(以便实现报表向上向下钻取的操作),Universe设计,其实就是在报表的使用对象和实际的表对象之间建立一个逻辑对应关系以及隔离关系。

做好这些,就需要在BO的InfoView里面设计好相关的报表,通过选定Universe文件后,然后再主界面中拖拉各种维度以及度量值,就可以很方面的创建各类报表,图表则拖拉报表模板进去,然后拖动维度和度量到模板中,加载数据就可以实现报表的数据显示了,如下所示:

先总结写到这里,有心得再继续记录了。

数据仓库开发之路之三--时间维度的创建

在数据仓库中,无一例外地需要和时间维度打交道,因此设计合理的时间维度,也是一个数据仓库项目开始必备的资源储备,如果有这方面的积累,就不用到处寻找合适的设计模型以及存储过程的代码了,否则可能需要花费一定的时间去寻找符合该项目合适的存储过程,或者自己动手编写。

一般来说,时间维度的创建要根据实际的数据仓库应用来,基本上可以分为天、月的时间维度表,更细的可以分为半小时时间段,小时时间段等等,一般数据量大的时间维度都是利用存储过程来生成的。

下面介绍一些时间维度表的设计结构。

<1> 时间维度表1(两列都是字段)

<1> 时间维度表2

a.日期维度

名称
代码 数据类型 主外键
序列号 C_ID int P
日期 C_DATE datetime P
星期 C_WEEK varchar(12) P
月份 C_MONTH varchar(2) P
C_YEAR varchar(4) P
季度 C_QUARTER varchar(4) P

b.半小时时间维度

名称 代码 数据类型 主外键
序列号 C_ID Varchar(50)  
时段 C_SHIDUAN Varchar(4000)  

c.时间段维度

名称
代码 数据类型 主外键
序列号 C_ID int P
时间段 C_Section varchar(50) P
开始时间 C_Begin varchar(50) P
结束时间 C_End varchar(50) P

3、比较完整的时间维度设计

Name
Type Nullable Comments
DAY_CODE VARCHAR2(8) N 日代码
DAY_LONG_DESC VARCHAR2(30) N 日完整名称
DAY_MEDIUM_DESC VARCHAR2(30) N 日中等长度名
DAY_SHORT_DESC VARCHAR2(30) N 日短名
WEEK_CODE VARCHAR2(8) N 周代码
WEEK_LONG_DESC VARCHAR2(30) N 周完整名称
WEEK_MEDIUM_DESC VARCHAR2(30) N 周中等长度名
WEEK_SHORT_DESC VARCHAR2(30) N 周短名
TEN_DAY_CODE VARCHAR2(8) N 旬代码
TEN_DAY_LONG_DESC VARCHAR2(30) N 旬完整名称
TEN_DAY_MEDIUM_DESC VARCHAR2(30) N 旬中等长度名
TEN_DAY_SHORT_DESC VARCHAR2(30) N 旬短名
MONTH_CODE VARCHAR2(8) N 月代码
MONTH_LONG_DESC VARCHAR2(30) N 月完整名称
MONTH_MEDIUM_DESC VARCHAR2(30) N 月中等长度名
MONTH_SHORT_DESC VARCHAR2(30) N 月短名
QUARTER_CODE VARCHAR2(8) N 季代码
QUARTER_LONG_DESC VARCHAR2(30) N 季完整名称
QUARTER_MEDIUM_DESC VARCHAR2(30) N 季中等长度名
QUARTER_SHORT_DESC VARCHAR2(30) N 季短名
HALF_YEAR_CODE VARCHAR2(8) N 半年代码
HALF_LONG_DESC VARCHAR2(30) N 半年完整名称
HALF_MEDIUM_DESC VARCHAR2(30) N 半年中等长度名
HALF_SHORT_DESC VARCHAR2(30) N 半年短名
YEAR_CODE VARCHAR2(8) N 年代码
YEAR_LONG_DESC VARCHAR2(30) N 年完整名称
YEAR_MEDIUM_DESC VARCHAR2(30) N 年中等长度名
YEAR_SHORT_DESC VARCHAR2(30) N 年短名
ALL_TIME_CODE VARCHAR2(8) N 全部时间代码
ALL_TIME_DESC VARCHAR2(30) N 全部时间名称
DAY_TIMESPAN NUMBER(3) N 日时间跨天
DAY_END_DATE VARCHAR2(8) N 结束日期
WEEK_TIMESPAN NUMBER(3) N 周跨天数
WEEK_END_DATE VARCHAR2(8) N 周结束日期
TEN_DAY_TIMESPAN NUMBER(3) N 旬跨天数
TEN_DAY_END_DATE VARCHAR2(8) N 旬结束日期
MONTH_TIMESPAN NUMBER(3) N 月跨天数
MONTH_END_DATE VARCHAR2(8) N 月结束日期
QUARTER_TIMESPAN NUMBER(3) N 季跨天数
QUARTER_END_DATE VARCHAR2(8) N 季结束日期
HALF_YEAR_TIMESPAN NUMBER(3) N 半年跨天数
HALF_YEAR_END_DATE VARCHAR2(8) N 半年结束日期
YEAR_TIMESPAN NUMBER(3) N 年跨天数
YEAR_END_DATE VARCHAR2(8) N 年结束日期
BDISABLED CHAR(1) N 月结束日期

构建时间维度的存储过程包体如下所示:

代码Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->
create or replace package body PKG_LOAD_DIM_TIME
as
/************************************
** 是否合理自然日
** 如果是合理自然日则返回1,否则返回0
************************************/
function F_Is_Day_ID
(
p_TIME_ID DIW.DW_DIM_TIME.DAY_CODE%type
) return number
is
v_Date date;
begin
v_Date := to_date(p_TIME_ID, 'YYYYMMDD');
return 1;
exception
when others then
return 0;
end F_Is_Day_ID;

/************************************
** 加载时间维度数据
************************************/
procedure P_BUILD_DIM_TIME
(
p_START_DATE DIW.DW_DIM_TIME.DAY_CODE%type, --开始日期
p_END_DATE DIW.DW_DIM_TIME.DAY_CODE%type --结束日期
)
is
v_START_DATE date; --开始日期
v_END_DATE date; --结束日期
v_DATE date;

v_YEAR varchar2(4);
v_QUARTER varchar2(1);
v_MONTH varchar2(2);
v_TEN_DAY varchar2(1);
v_WEEK varchar2(2);
v_WEEK_YEAR varchar2(4);
v_DAY varchar2(2);

begin
--BICODE.PKG_ETL_CONTROLLER.P_ETL_WRITE_LOG('一般','BICODE.PKG_LOAD_DIM_TIME.P_BUILD_DIM_TIME执行开始...');
execute immediate 'TRUNCATE TABLE DIW.ODS_DIM_TIME';

if F_Is_Day_ID(p_START_DATE)=1 and F_Is_Day_ID(p_END_DATE)=1 then

v_START_DATE := TO_DATE(p_START_DATE,'YYYYMMDD');
v_END_DATE := TO_DATE(p_END_DATE,'YYYYMMDD');

if v_END_DATE - v_START_DATE >= 0 then
--开始生成
for i in 0..v_END_DATE - v_START_DATE loop

v_DATE := v_START_DATE+i;
v_YEAR := TO_CHAR(v_DATE,'YYYY');
v_QUARTER := TO_CHAR(v_DATE,'Q');
v_MONTH := TO_CHAR(v_DATE,'MM');
v_TEN_DAY := case
when TO_CHAR(v_DATE,'DD')<'11' then '1'
when TO_CHAR(v_DATE,'DD')<'21' then '2'
when TO_CHAR(v_DATE,'DD')<'32' then '3'
end;
--周方案一:星期被年分开,实际是7天分段不是自然周
--v_WEEK := TO_CHAR(v_DATE,'WW');
--v_WEEK_YEAR := v_YEAR;

--周方案二:本星期星期四所在年
--v_WEEK := TO_CHAR(v_DATE,'IW');
--select TO_CHAR(NEXT_DAY(v_DATE-7,2)+3,'YYYY') into v_WEEK_YEAR from dual;
----v_WEEK_YEAR := TO_CHAR(NEXT_DAY(v_DATE-7,2)+3,'YYYY');--奇怪的错误??

--周方案三:自然周,周被年分,没找到函数支持。
select
LPAD(TO_CHAR(TRUNC((v_DATE
-to_date(v_YEAR||'0101','yyyymmdd')
+DECODE(TO_NUMBER(to_CHAR(to_date(v_YEAR||'0101','yyyymmdd'),'D')),1,7,
TO_NUMBER(to_CHAR(to_date(v_YEAR||'0101','yyyymmdd'),'D'))-1)-1)/7+1)),2,'0')
INTO v_WEEK
from dual;
v_WEEK_YEAR := v_YEAR;

v_DAY := TO_CHAR(v_DATE,'DD');

insert into DIW.DW_DIM_TIME
(
DAY_CODE,
DAY_LONG_DESC,
DAY_MEDIUM_DESC,
DAY_SHORT_DESC,
WEEK_CODE,
WEEK_LONG_DESC,
WEEK_MEDIUM_DESC,
WEEK_SHORT_DESC,
TEN_DAY_CODE,
TEN_DAY_LONG_DESC,
TEN_DAY_MEDIUM_DESC,
TEN_DAY_SHORT_DESC,
MONTH_CODE,
MONTH_LONG_DESC,
MONTH_MEDIUM_DESC,
MONTH_SHORT_DESC,
QUARTER_CODE,
QUARTER_LONG_DESC,
QUARTER_MEDIUM_DESC,
QUARTER_SHORT_DESC,
HALF_YEAR_CODE,
HALF_LONG_DESC,
HALF_MEDIUM_DESC,
HALF_SHORT_DESC,
YEAR_CODE,
YEAR_LONG_DESC,
YEAR_MEDIUM_DESC,
YEAR_SHORT_DESC,
ALL_TIME_CODE,
ALL_TIME_DESC,
DAY_TIMESPAN,
DAY_END_DATE,
WEEK_TIMESPAN,
WEEK_END_DATE,
TEN_DAY_TIMESPAN,
TEN_DAY_END_DATE,
MONTH_TIMESPAN,
MONTH_END_DATE,
QUARTER_TIMESPAN,
QUARTER_END_DATE,
HALF_YEAR_TIMESPAN,
HALF_YEAR_END_DATE,
YEAR_TIMESPAN,
YEAR_END_DATE
)
values
(
v_YEAR||v_MONTH||v_DAY,
v_YEAR||'年'||v_MONTH||'月'||v_DAY||'日',
/*v_MONTH||'月'||*/v_DAY||'日',
v_YEAR||'-'||v_MONTH||'-'||v_DAY,
v_WEEK_YEAR||'W'||v_WEEK,
v_WEEK_YEAR||'年第'||v_WEEK||'周',
'第'||v_WEEK||'周',
v_WEEK_YEAR||'-W'||v_WEEK,
v_YEAR||v_MONTH||'X'||v_TEN_DAY,
v_YEAR||'年'||v_MONTH||'月'||decode(v_TEN_DAY,'1','上','2','中','下')||'旬',
decode(v_TEN_DAY,'1','上','2','中','下')||'旬',
v_YEAR||'-'||v_MONTH||'-X'||v_TEN_DAY,
v_YEAR||v_MONTH,
v_YEAR||'年'||v_MONTH||'月',
v_MONTH||'月',
v_YEAR||'-'||v_MONTH,
v_YEAR||'Q'||v_QUARTER,
v_YEAR||'年第'||v_QUARTER||'季度',
'第'||v_QUARTER||'季度',
v_YEAR||'-'||'Q'||v_QUARTER,
v_YEAR||'H'||decode(v_QUARTER,'1','1','2','1','2'),
v_YEAR||'年'||decode(v_QUARTER,'1','上','2','上','下')||'半年',
decode(v_QUARTER,'1','上','2','上','下')||'半年',
v_YEAR||'-'||'H'||decode(v_QUARTER,'1','1','2','1','2'),
v_YEAR,
v_YEAR||'年',
v_YEAR||'年',
v_YEAR,
'ALL',
'ALL_TIME',
1,
v_YEAR||v_MONTH||v_DAY,
case
when
TO_CHAR(NEXT_DAY(v_DATE-7,2),'YYYY')<v_WEEK_YEAR
then
NEXT_DAY(v_DATE,2)-TO_DATE(v_WEEK_YEAR||'0101','YYYYMMDD')
when
TO_CHAR(NEXT_DAY(v_DATE,2),'YYYY')>v_WEEK_YEAR
then
TO_DATE(v_WEEK_YEAR||'1231','YYYYMMDD')-NEXT_DAY(v_DATE-7,2)+1
else 7
end,
case
when
TO_CHAR(NEXT_DAY(v_DATE,2),'YYYY')>v_WEEK_YEAR
then v_WEEK_YEAR||'1231'
else TO_CHAR(NEXT_DAY(v_DATE,2)-1,'YYYYMMDD')
end,
decode(v_TEN_DAY,'3',LAST_DAY(v_DATE)-TO_DATE(v_YEAR||v_MONTH||'21','YYYYMMDD')+1,10),
decode(v_TEN_DAY,'3',TO_CHAR(LAST_DAY(v_DATE),'YYYYMMDD'),'2',v_YEAR||v_MONTH||'20',v_YEAR||v_MONTH||'10'),
TO_NUMBER(TO_CHAR(LAST_DAY(v_DATE),'DD')),
TO_CHAR(LAST_DAY(v_DATE),'YYYYMMDD'),
decode(v_QUARTER,'1',TO_DATE(v_YEAR||'0331','YYYYMMDD')-TO_DATE(v_YEAR||'0101','YYYYMMDD')+1,'2',91,92),
decode(v_QUARTER,'1',v_YEAR||'0331','2',v_YEAR||'0630','3',v_YEAR||'0930',v_YEAR||'1231'),
decode(v_QUARTER,'3',184,'4',184,TO_DATE(v_YEAR||'0630','YYYYMMDD')-TO_DATE(v_YEAR||'0101','YYYYMMDD')+1),
decode(v_QUARTER,'1',v_YEAR||'0630','2',v_YEAR||'0630',v_YEAR||'1231'),
TO_DATE(v_YEAR||'1231','YYYYMMDD')-TO_DATE(v_YEAR||'0101','YYYYMMDD')+1,
v_YEAR||'1231'
)
;
end loop;
commit;
end if;
end if;

--BICODE.PKG_ETL_CONTROLLER.P_UPDATE_ETL_TIME_INFO('DW','DIM_TIME');
--BICODE.PKG_ETL_CONTROLLER.P_ETL_WRITE_LOG('一般','BICODE.PKG_LOAD_DIM_TIME.P_BUILD_DIM_TIME执行结束...');

exception
when others then
rollback;
--BICODE.PKG_ETL_CONTROLLER.P_ETL_WRITE_LOG('异常','BICODE.PKG_LOAD_DIM_TIME.P_BUILD_DIM_TIME执行失败...');

end P_BUILD_DIM_TIME;
end PKG_LOAD_DIM_TIME;

有时候需要精确度到月份的时间维度表,由于上面的日期时间维度表相对信息比较丰富,可以建立一个视图来影射一个月度时间维度表,如下图所示:

Code highlighting produced by 
                                Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->CREATE 
                                OR REPLACE VIEW DW_DIM_TIME_MONTH_V AS
SELECT DISTINCT
T.MONTH_CODE,
T.MONTH_LONG_DESC,
T.MONTH_MEDIUM_DESC,
T.MONTH_SHORT_DESC,
T.QUARTER_CODE,
T.QUARTER_LONG_DESC,
T.QUARTER_MEDIUM_DESC,
T.QUARTER_SHORT_DESC,
T.HALF_YEAR_CODE,
T.HALF_LONG_DESC,
T.HALF_MEDIUM_DESC,
T.HALF_SHORT_DESC,
T.YEAR_CODE,
T.YEAR_LONG_DESC,
T.YEAR_MEDIUM_DESC,
T.YEAR_SHORT_DESC
FROM DIW.DW_DIM_TIME T;
相关文章

基于EA的数据库建模
数据流建模(EA指南)
“数据湖”:概念、特征、架构与案例
在线商城数据库系统设计 思路+效果
 
相关文档

Greenplum数据库基础培训
MySQL5.1性能优化方案
某电商数据中台架构实践
MySQL高扩展架构设计
相关课程

数据治理、数据架构及数据标准
MongoDB实战课程
并发、大容量、高性能数据库设计与优化
PostgreSQL数据库实战培训
 
分享到
 
 


MySQL索引背后的数据结构
MySQL性能调优与架构设计
SQL Server数据库备份与恢复
让数据库飞起来 10大DB2优化
oracle的临时表空间写满磁盘
数据库的跨平台设计
更多...   


并发、大容量、高性能数据库
高级数据库架构设计师
Hadoop原理与实践
Oracle 数据仓库
数据仓库和数据挖掘
Oracle数据库开发与管理


GE 区块链技术与实现培训
航天科工某子公司 Nodejs高级应用开发
中盛益华 卓越管理者必须具备的五项能力
某信息技术公司 Python培训
某博彩IT系统厂商 易用性测试与评估
中国邮储银行 测试成熟度模型集成(TMMI)
中物院 产品经理与产品管理
更多...