几个模块的总结

做了一个项目的几个模块,里面有些知识点总结一下:

 

(一)retail(零售行业) 总结

该表是关于前推周的数据(都是周累计,本周累计不计算),包括前推周,其中跨年周是个难点。

首先传入日期(由于本周累计不计算,所以所有的周都是一整周)
,然后到周维表里求出上周的周号 赋予v_end_date。
再到目标表中把最大日期(也是周号)求出赋予max_date,然后拿v_end_date和max_date进行比较,如果相等,说明这周已经跑过,就不需要跑

了,不相等才往下运行(其实这就是说符合每周一去跑数据,周一跑上一周的数据)。
不相等时再在max_date上加上7赋予v_start_date,然后跑源表中的数据,时间限制是跟周维表结合求出v_start_date和v_end_date之间的数据(

按照各个维度分组求出各个指标的汇总)。
由于之后要求前推周,并且源表的数据是如果某个时间某个维度下
没有数据就没有记录,所以在算前推的时候就会出现隔时间的状况,所以需要根据各个维度作为主表和刚才的表做左连接(该步称作补全操作)

把数据求出放入中间表;其中时间维度是周数,为了处理跨年周的问题,需要把每周的开始时间也作为一个单独的列进行放入中间表。

有时候可能会出现隔了几周才跑数据的情况,这个时候就要把v_start_date和v_end_date之间的周放入一个中间表,然后用游标去循环跑这些月

份,里面用lag分析函数去处理前推周。为了处理跨年周,需要按照中间表的除了周号外的维度进行分组求各个指标的平均值,这个时候也就是把

跨年周变为一周,同时把周开始求出,然后和周维表关联(用周开始时间),因为维表里跨年周有两个开始时间,所以就会出现两条一样的数据

,这样就解决了最终表数据的跨年周问题;  最终表里的时间还是周号。

如果有同期周的话,就在周号上减去100就是同期周,有的话就求出,没的话就不求。这样的话最终表里的数据就会出现除了维度之外所有指标都

是Null的数据,对这部分数据进行删除即可。

当然如果时间维度是月的话,处理思想是一样的,就是如果有同期月的话,在月号上减去13就OK了。

 

(二)purcharse (采购) 总结

里面有关于本周累计和同期周累计(先找到这一天是所在周是本年第几周放入v_last_week_num,然后看本周与周日相差的天数放入v_date_num,
然后找到上年的相同的周,从周日累计到该周的周日加上v_date_num的数据就是同期周累计;即上年的同周,同周几<星期几>)

(三)正则表达式函数

--这个条件传过来的f_filed字段,是三个字段(日期、采购分类分类代理键、kpi名称)的链接字段,在这里需要分解开
SELECT regexp_substr(f_filed, '[^,]+', 1, 1),
       regexp_substr(f_filed, '[^,]+', 1, 2),
       regexp_substr(f_filed, '[^,]+', 1, 3)
  INTO v_filed_one,
       v_filed_two,
       v_filed_three
  FROM dual;

(四)分析表
1.oracle里凡是DDL的操作(create table、truncate table、create index、drop table、drop index等类似的操作)在存储过程里执行必需使

用动态SQL,否则存储过程编译时会报错。
2.oracle9i版本以前都要定期对频繁操作的大表进行表分析,oracle10g版本以后就不需要了,oracle每晚主动对所有表进行表分析,周一到周五

都是22:00执行;但是如果对插入过数据的表的立即使用的情况,还是可以手工做表分析的:

    --完全分析
    analyze table customer compute statistics

    --百分比分析
    analyze table customer estimate statistics sample 20 percent

你可能感兴趣的:(几个模块的总结)