• 生成部门维度数据


    1.生成部门维度表

    SELECT 
           FN_Get_SubtrDeptStrs(DEPT_KEY_PATH, DEPT_LEVELS) DEPT_KEY,
           FN_Get_SubtrDeptStrs(DEPT_NAME_PATH, DEPT_LEVELS) DEPT_NAME,
           DEPT_LEVELS DEPT_LEVEL,
           ISLEAF,
           PARENT_KEY,
           FN_Get_SubtrDeptStrs(DEPT_KEY_PATH, 1) DEPT_KEY1,
           FN_Get_SubtrDeptStrs(DEPT_NAME_PATH, 1) DEPT_NAME1,
           FN_Get_SubtrDeptStrs(DEPT_KEY_PATH, 2) DEPT_KEY2,
           FN_Get_SubtrDeptStrs(DEPT_NAME_PATH, 2) DEPT_NAME2,
           FN_Get_SubtrDeptStrs(DEPT_KEY_PATH, 3) DEPT_KEY3,
           FN_Get_SubtrDeptStrs(DEPT_NAME_PATH, 3) DEPT_NAME3,
           FN_Get_SubtrDeptStrs(DEPT_KEY_PATH, 4) DEPT_KEY4,
           FN_Get_SubtrDeptStrs(DEPT_NAME_PATH, 4) DEPT_NAME4
         
      FROM (SELECT SUBSTR(SYS_CONNECT_BY_PATH(DEPT_KEY, '^'), 1) || '^' DEPT_KEY_PATH,
                   SUBSTR(SYS_CONNECT_BY_PATH(DEPT_NAME, '^'), 1) || '^' DEPT_NAME_PATH,             
                   V.DEPT_KEY,
                   V.DEPT_CODE,
                   V.DEPT_NAME,
                   V.PARENT_KEY,
                   V.DEPT_LEVEL,
                   LEVEL        DEPT_LEVELS,
                   CONNECT_BY_ISLEAF ISLEAF
              FROM dw_hrm_subj.DIM_DW_DEPT_ALL_V V
             START WITH V.PARENT_KEY = 119
            CONNECT BY V.PARENT_KEY = PRIOR V.DEPT_KEY)
     ORDER BY DEPT_KEY_PATH;
    生成维度数据

    2.字符串截取函数

    create or replace function FN_Get_SubtrDeptStrs(i_dept_strs in varchar2, i_str_seq in number) return varchar2 is
      v_str_start_posize number:=0;
      v_str_next_posize number:=0;
      v_str_length  number:=0;
      v_str              varchar2(2000):='';
    begin
      
      v_str_start_posize:=instr(i_dept_strs,'^',1,i_str_seq);
      v_str_next_posize:=instr(i_dept_strs,'^',1,i_str_seq+1);
      v_str_length:=v_str_next_posize-v_str_start_posize;
      v_str:=substr(i_dept_strs,v_str_start_posize,v_str_length);
      v_str:=replace(v_str,'^','');
      
    
      return(v_str);
    end FN_Get_SubtrDeptStrs;
    部门字符串截取

    3.生成时间维度

    create or replace procedure P_CREATE_DIM_DATE_TIME is
    V_END_DATE DATE:=ADD_MONTHS(SYSDATE, 36);
    V_START_DATE DATE:=TO_DATE('1980-01-01 00:00:01','YYYY-MM-DD HH24:MI:SS');
    I NUMBER:=1;
    
    V_DATE_TIME_ID    NUMBER:=0;
    V_DATE_TIME_NAME    VARCHAR2(120):='';
    V_YEAR_ID    NUMBER:=0;
    V_YEAR_NAME    VARCHAR2(10):='';
    V_QUTER_ID    NUMBER:=0;
    V_QUTER_NAME    VARCHAR2(30):='';
    V_MONTH_ID    NUMBER:=0;
    V_MONTH_NAME    VARCHAR2(30):='';
    V_DAY_ID    NUMBER:=0;
    V_DAY_NAME    VARCHAR2(30):='';
    V_WEEK_NAME    VARCHAR2(30):='';
    V_DATE_TIME_TYPE VARCHAR2(10):='';
    
    V_END_DATE_TIME NUMBER:=0;
    V_STA_DATE_TIME NUMBER:=0;
    begin
         delete from   DIM_DATE_TIME ;
         commit;
    
      ----1.生成时间维度表的年度信息
          V_END_DATE_TIME :=TO_NUMBER(TO_CHAR(V_END_DATE,'YYYY'));
          V_STA_DATE_TIME :=TO_NUMBER(TO_CHAR(V_START_DATE,'YYYY'));
          WHILE V_STA_DATE_TIME<=V_END_DATE_TIME LOOP
          V_DATE_TIME_ID:=V_STA_DATE_TIME;
          V_DATE_TIME_NAME:=V_STA_DATE_TIME||'';
          V_YEAR_ID:=V_STA_DATE_TIME;
          V_YEAR_NAME:=V_STA_DATE_TIME||'';
          V_DATE_TIME_TYPE:='Y';
          INSERT INTO DIM_DATE_TIME
            (DATE_TIME_ID,
             DATE_TIME_NAME,
             YEAR_ID,
             YEAR_NAME,
             DATE_TIME_TYPE)
          VALUES
            (V_DATE_TIME_ID,
             V_DATE_TIME_NAME,
             V_YEAR_ID,
             V_YEAR_NAME,
             V_DATE_TIME_TYPE);
          V_STA_DATE_TIME:=V_STA_DATE_TIME+1;
    
    
          END LOOP;
          COMMIT;
    
       ----2.生成时间维度表的季度信息
          V_END_DATE_TIME :=TO_NUMBER(TO_CHAR(V_END_DATE,'YYYY'));
          V_STA_DATE_TIME :=TO_NUMBER(TO_CHAR(V_START_DATE,'YYYY'));
          WHILE V_STA_DATE_TIME<=V_END_DATE_TIME LOOP
                FOR I in 1..4 LOOP
                    V_DATE_TIME_ID:=V_STA_DATE_TIME||I;
                    V_DATE_TIME_NAME:=V_STA_DATE_TIME||''||I||'季度';
                    V_YEAR_ID:=V_STA_DATE_TIME;
                    V_YEAR_NAME:=V_STA_DATE_TIME||'';
                    V_QUTER_ID:=V_STA_DATE_TIME||I;
                    V_QUTER_NAME:=V_STA_DATE_TIME||''||I||'季度';
                    V_DATE_TIME_TYPE:='Q';
    
                    INSERT INTO DIM_DATE_TIME
                      (DATE_TIME_ID,
                       DATE_TIME_NAME,
                       YEAR_ID,
                       YEAR_NAME,
                       QUTER_ID,
                       QUTER_NAME,
                       DATE_TIME_TYPE)
                    VALUES
                      (V_DATE_TIME_ID,
                       V_DATE_TIME_NAME,
                       V_YEAR_ID,
                       V_YEAR_NAME,
                       V_QUTER_ID,
                       V_QUTER_NAME,
                       V_DATE_TIME_TYPE);
                END LOOP;
                 V_STA_DATE_TIME:=V_STA_DATE_TIME+1;
          END LOOP;
          COMMIT;
    
    
          ----3.生成时间维度表的月份信息
          FOR CUR_DATE IN
          (  SELECT
              C.DATE_TIME_ID,C.YEAR_ID,C.YEAR_NAME,C.QUTER_ID,C.QUTER_NAME,
              DECODE(MOD(ROWNUM,12),0,12,MOD(ROWNUM,12)) MONTH_NUM
              FROM
              (
              SELECT B.*FROM
                (
                  SELECT A.DATE_TIME_ID,A.YEAR_ID,A.YEAR_NAME,A.QUTER_ID,A.QUTER_NAME FROM DIM_DATE_TIME A WHERE A.DATE_TIME_TYPE='Q'
                  UNION ALL
                  SELECT A.DATE_TIME_ID,A.YEAR_ID,A.YEAR_NAME,A.QUTER_ID,A.QUTER_NAME FROM DIM_DATE_TIME A WHERE A.DATE_TIME_TYPE='Q'
                  UNION ALL
                  SELECT A.DATE_TIME_ID,A.YEAR_ID,A.YEAR_NAME,A.QUTER_ID,A.QUTER_NAME FROM DIM_DATE_TIME A WHERE A.DATE_TIME_TYPE='Q'
                )B ORDER BY B.DATE_TIME_ID ASC
              ) C
          )
          LOOP
              if CUR_DATE.MONTH_NUM<10 THEN
              V_DATE_TIME_ID:=CUR_DATE.YEAR_ID||'0'||CUR_DATE.MONTH_NUM;
              ELSE
              V_DATE_TIME_ID:=CUR_DATE.YEAR_ID||CUR_DATE.MONTH_NUM;
              END IF;
              V_DATE_TIME_NAME:=CUR_DATE.YEAR_NAME||CUR_DATE.MONTH_NUM||'';
              V_YEAR_ID:=CUR_DATE.YEAR_ID;
              V_YEAR_NAME:=CUR_DATE.YEAR_NAME;
              V_QUTER_ID:=CUR_DATE.QUTER_ID;
              V_QUTER_NAME:=CUR_DATE.QUTER_NAME;
              V_MONTH_ID:=V_DATE_TIME_ID;
              V_MONTH_NAME:=V_DATE_TIME_NAME;
              V_DATE_TIME_TYPE:='M';
    
              INSERT INTO DIM_DATE_TIME
                (DATE_TIME_ID,
                 DATE_TIME_NAME,
                 YEAR_ID,
                 YEAR_NAME,
                 QUTER_ID,
                 QUTER_NAME,
                 MONTH_ID,
                 MONTH_NAME,
                 DATE_TIME_TYPE
                 )
              VALUES
                (V_DATE_TIME_ID,
                 V_DATE_TIME_NAME,
                 V_YEAR_ID,
                 V_YEAR_NAME,
                 V_QUTER_ID,
                 V_QUTER_NAME,
                 V_MONTH_ID,
                 V_MONTH_NAME,
                 V_DATE_TIME_TYPE
                 );
    
          END LOOP;
          COMMIT;
    
    
          ----1.生成时间维度表的天信息
    
          WHILE V_START_DATE<V_END_DATE LOOP
    
          V_YEAR_ID:=TO_CHAR(V_START_DATE,'YYYY');
          V_YEAR_NAME:=TO_CHAR(V_START_DATE,'YYYY')||'';
          V_QUTER_ID:=TO_CHAR(V_START_DATE,'YYYY')||TO_CHAR(V_START_DATE,'Q');
          V_QUTER_NAME    :=TO_CHAR(V_START_DATE,'YYYY')||''||TO_CHAR(V_START_DATE,'Q')||'季度';
          V_MONTH_ID :=TO_CHAR(V_START_DATE,'YYYYMM');
          V_MONTH_NAME:=TO_CHAR(V_START_DATE,'YYYY')||''||TO_CHAR(V_START_DATE,'MM')||'';
          V_DATE_TIME_ID:=TO_CHAR(V_START_DATE,'YYYYMMDD');
          V_DATE_TIME_NAME:=V_MONTH_NAME||TO_CHAR(V_START_DATE,'DD')||'';
          V_DATE_TIME_TYPE:='D';
          V_DAY_ID:=V_DATE_TIME_ID;
          V_DAY_NAME:=V_DATE_TIME_NAME;
          V_WEEK_NAME:=TO_CHAR(V_START_DATE,'DAY');
    
          INSERT INTO DIM_DATE_TIME
            (DATE_TIME_ID,
             DATE_TIME_NAME,
             YEAR_ID,
             YEAR_NAME,
             QUTER_ID,
             QUTER_NAME,
             MONTH_ID,
             MONTH_NAME,
             DAY_ID,
             DAY_NAME,
             WEEK_NAME,
             DATE_TIME_TYPE)
          VALUES
            (V_DATE_TIME_ID,
             V_DATE_TIME_NAME,
             V_YEAR_ID,
             V_YEAR_NAME,
             V_QUTER_ID,
             V_QUTER_NAME,
             V_MONTH_ID,
             V_MONTH_NAME,
             V_DAY_ID,
             V_DAY_NAME,
             V_WEEK_NAME,
             V_DATE_TIME_TYPE);
    
    
          COMMIT;
          V_START_DATE:=V_START_DATE+1;
    
          END LOOP;
          COMMIT;
    
    
    end P_CREATE_DIM_DATE_TIME;
    生成时间维度
    CREATE TABLE DIM_DATE_TIME 
       (  DATE_TIME_ID NUMBER, 
          DATE_TIME_NAME VARCHAR2(120), 
          YEAR_ID NUMBER, 
          YEAR_NAME VARCHAR2(10), 
          QUTER_ID NUMBER, 
          QUTER_NAME VARCHAR2(30), 
          MONTH_ID NUMBER, 
          MONTH_NAME VARCHAR2(30), 
          DAY_ID NUMBER, 
          DAY_NAME VARCHAR2(30), 
          WEEK_NAME VARCHAR2(30), 
          DATE_TIME_TYPE VARCHAR2(10)
       );
    时间维度表结构
    CREATE OR REPLACE PROCEDURE P_CREATE_DIM_WEEK IS
      V_END_DATE DATE:=ADD_MONTHS(SYSDATE, 36);
      V_START_DATE DATE:=TO_DATE('1980-01-01 00:00:01','YYYY-MM-DD HH24:MI:SS');
    
      V_YEAR NUMBER:=0;
      V_WEEK NUMBER:=0;
      V_MONTH NUMBER:=0;
      V_DATE_ID NUMBER:=0;
      V_ROW_NUM NUMBER:=0;
    
      V_WEEK_IN_YEAR_ID    NUMBER:=0;
      V_WEEK_IN_YEAR    VARCHAR2(120):='';
      V_WEEK_START_DATE    DATE:=NULL;
      V_WEEK_END_DATE    DATE:=NULL;
      V_DATE_TIME_TYPE VARCHAR2(10):='W';
    
      V_END_DATE_TIME NUMBER:=0;
      V_STA_DATE_TIME NUMBER:=0;
    BEGIN
         DELETE FROM  DIM_WEEK_IN_YEAR ;
         COMMIT;
    
      ----1.生成时间维度表的年度信息
          V_END_DATE_TIME :=TO_NUMBER(TO_CHAR(V_END_DATE,'YYYY'));
          V_STA_DATE_TIME :=TO_NUMBER(TO_CHAR(V_START_DATE,'YYYY'));
          
          WHILE V_START_DATE<=V_END_DATE LOOP
            
             V_MONTH:=TO_NUMBER(TO_CHAR(V_START_DATE,'MM'));
             V_WEEK:=TO_NUMBER(TO_CHAR(V_START_DATE,'IW')); 
            
          IF V_MONTH<=1 AND V_WEEK >=50 THEN
            
             V_YEAR:=TO_NUMBER(TO_CHAR(V_START_DATE,'YYYY'))-1;
          ELSE  
             V_YEAR:=TO_NUMBER(TO_CHAR(V_START_DATE,'YYYY'));
             
          END IF;
          V_DATE_ID:=TO_NUMBER(TO_CHAR(V_START_DATE,'YYYYMMDD'));    
          V_WEEK_IN_YEAR_ID:=TO_NUMBER(TO_CHAR(V_YEAR) || TO_CHAR(V_START_DATE,'IW'));
          V_WEEK_IN_YEAR:=TO_CHAR(V_YEAR)||'年第'||TO_CHAR(V_START_DATE,'IW')||'';
          V_WEEK_START_DATE:=TO_DATE(TO_CHAR(TRUNC(TO_DATE(TO_CHAR(V_START_DATE,'YYYY-MM-DD'),'YYYY-MM-DD'),'IW'),'YYYY-MM-DD'),'YYYY-MM-DD');
          V_WEEK_END_DATE:=TO_DATE(TO_CHAR(TRUNC(TO_DATE(TO_CHAR(V_START_DATE,'YYYY-MM-DD'),'YYYY-MM-DD'),'IW') + 6,'YYYY-MM-DD'),'YYYY-MM-DD');
    
            INSERT INTO DIM_WEEK_IN_YEAR
              (
               DATE_ID,
               WEEK_IN_YEAR_ID,
               WEEK_IN_YEAR,
               WEEK_START_DATE,
               WEEK_END_DATE,
               DATE_TIME_TYPE
              )
            VALUES
              (V_DATE_ID,
               V_WEEK_IN_YEAR_ID,
               V_WEEK_IN_YEAR,
               V_WEEK_START_DATE,
               V_WEEK_END_DATE,
               V_DATE_TIME_TYPE
              );
           
          
            V_ROW_NUM:=V_ROW_NUM+1;
           
          IF MOD(V_ROW_NUM,1000)=0 THEN
           COMMIT;
          END IF;
          
           V_START_DATE:=V_START_DATE+1;
           
          END LOOP;
          COMMIT;
    
    
    
    END P_CREATE_DIM_WEEK;
    时间自然周
    CREATE TABLE DIM_WEEK_IN_YEAR 
       (  DATE_ID NUMBER, 
          WEEK_IN_YEAR_ID NUMBER, 
          WEEK_IN_YEAR VARCHAR2(30), 
          WEEK_START_DATE DATE, 
          WEEK_END_DATE DATE, 
          DATE_TIME_TYPE VARCHAR2(10)
       ) ;
       COMMENT ON TABLE CDMDATAMARKET.DIM_WEEK_IN_YEAR  IS '时间维度年周';
    时间自然周表结构
  • 相关阅读:
    在360工作的这几天
    ISBN号码
    poj 3667 Hotel
    命令模式之2 Invoker Vs. Client
    vehicle time series data analysis
    JSON之三:获取JSON文本并解释(以google的天气API为例)
    创建型模式--工厂方法模式
    OpenStack Heat总结之:Icehouse中通过Heat+Ceilometer实现Autoscaling
    MyEclipse10 中增加svn插件
    activitie用户手册
  • 原文地址:https://www.cnblogs.com/HondaHsu/p/4730629.html
Copyright © 2020-2023  润新知