Bootstrap

数仓搭建实操(传统数仓orale):DWB基础数据层

DWB基础数据层>>划分主题,构建宽表

创建宽表

示例: 高端客户表

CREATE TABLE DWB.HIGH_CUST_TAB
AS
SELECT
  LN.ECIF_CUST_NO,
  LN.CUSTNAME,
  LN.ISCOMMAC,
  LN.CURRSIGN,
  LN.LOANKIND,
  LN.LOANTYPE,
  LN.FIRSTORDER,
  LN.PAYPERC,
  LN.FUNDSOUR,
  LN.LOANUSE,
  LN.ASSUKIND,
  LN.CONTDATE,
  LN.CREDCAPI,
  LN.CYCFLAG,
  LN.TCAPI,
  LN.THISTCAPI,
  LN.TERMFREQ,
  LN.TTERM,
  LN.RETUTYPE,
  LN.TROTHDUEDAY,
  LN.FIXRATETERM,
  LN.FIRSTDUEDATE,
  LN.SUBSFLAG,
  LN.ISENOUSUBS,
  LN.FIRSTPAYAMT,
  LN.FIRSTPAYPERC,
  LN.CORPID,
  LN.PROJID,
  LN.CORPAPPID,
  LN.RELEWAY,
  LN.PAYEEACNO,
  LN.PAYEEACNAME,
  LN.PAYEEBANKNAME,
  LN.INTECALCKIND,
  LN.INTEMETH,
  LN.INTEBASE,
  LN.AHEADDAYS,
  LN.BASICINTERATE,
  LN.INTERATE,
  LN.INTEFINERATEFLOAT,
  LN.CAPIFINERATEFLOAT,
  LN.FINERATE,
  LN.CAPIFINERATE,
  LN.FOULRATE,
  LN.EMBERATEFLOAT,
  LN.BEGINDATE,
  LN.ENDDATE,
  LN.LOANACNO,
  LN.CONTKIND,
  LN.CONTNO,
  LN.APPRNAME,
  LN.APPRTABNO,
  LN.APPRDATE,
  LN.APPRFLAG,
  LN.APPRSTATE,
  LN.LOANSTATE,
  CI.CUST_NAME,
  CI.BIRTH_DT,
  CI.SEX,
  CI.MRG_STS,
  CI.REGISTER,
  CI.PPL_COD,
  CI.COU_CERT_NO,
  CI.COU_NAME,
  CI.RELIGION,
  CI.EDUC_LEV,
  CI.HOUSE_TYP,
  CI.INDV_TAX_NO,
  CI.INDV_INSURS_NO,
  CI.HAVE_WORK_YR,
  CI.OCCUP_COD,
  CI.QUALIFICATION_STS,
  CI.EMPLOYER_NAME,
  CI.UNIT_CHAR,
  CI.UNIT_WORK_DT,
  CI.WORK_NO,
  CI.POSN,
  CI.OFRN,
  CI.TITL,
  CI.MN_INCO,
  CI.ECON_RESUR,
  CI.OTH_ECON_RESUR,
  CI.DEPEND_CNT,
  CI.LANGUAGE_PRE,
  CI.AFF_INSTN_NO,
  CI.CUST_MNGR_COD,
  CI.CUST_STS,
  CI.EMP_FLG,
  CI.POT_VIP_FLG,
  CI.SPEC_VIP_FLG,
  CI.INDV_CUST_ACCUM_TRN_LMT,
  CI.CRED_CRD_GUAR_CNT,
  CI.FAMI_AVG_MN_INCO,
  CI.FAMI_CAPI,
  CI.FAMI_DEBT,
  CI.FAMI_MN_INCO,
  CI.GRAD_DT,
  CI.CHILD_FLG,
  CI.INDUSTRY_TYP,
  CI.FAMI_GUAR_TOTL,
  CI.PLAN_CPTL_CERT_NO,
  CI.STUDY_INST,
  CI.STUDY_SPEC,
  CI.RESI_YR,
  CI.CERT_TYP,
  CI.CERT_NO,
  CI.PRIM_NAT,
  CI.RSDNT_NAT,
  CI.CONC_CUST_FLG,
  CI.BEST_CONT_TM,
  CI.BEST_CONT_STY,
  CHILI.INDV_LEV_TYP,
  CHILI.EVAL_INSTN,
  CHILI.EVAL_DT,
  CHILI.INDV_LEV_COD,
  CHILI.CRLMT,
  CHILI.CRED_LOTP,
  CHILI.EVAL_VAL,
  CHILI.EVAL_DESC,
  CHILI.BANK_ID,
  CHILI.EXT_SYS_CUST_NO,
  CHILI.EXT_SYS_NO,
  CHPAR.PTY_ADDR_RELA_TYP,
  CHPAR.ADDR_ID
FROM DWD.LN_LNP_CTRT_CBAPP LN
INNER JOIN  DWD.CI_CIPH_HIGH_CUST_INFO CI
ON LN.ECIF_CUST_NO = CI.ECIF_CUST_NO
INNER JOIN DWD.CI_CIPH_HIGH_INDV_LEV_INFO CHILI 
ON CHILI.ECIF_CUST_NO = CI.ECIF_CUST_NO
INNER JOIN DWD.CI_CIPH_HIGH_PTY_ADDR_RELA CHPAR
ON CHPAR.ECIF_CUST_NO = CI.ECIF_CUST_NO;

分析

用到的表:

 CI_CIPH_HIGH_CUST_INFO;  个人高端客户信息>>连接字段ECIF_CUST_NO

CI_CIPH_HIGH_INDV_LEV_INFO; 个人高端个人等级信息表>>连接字段ECIF_CUST_NO

CI_CIPH_HIGH_PTY_ADDR_RELA ;个人高端参与人和联系地址的关系>>连接字段ECIF_CUST_NO

LN_LNP_CTRT_CBAPP; 个人贷款申请信息档>>连接字段 ECIF_CUST_NO

 主表: 个人贷款申请信息档

只有申请成功才是客户>>连接方式: 内连接

字段选择>有重复字段

先选择全部字段>>复制到excell表>>全选数据>>分列>>按照分隔符分列>>其他:输入' . '

分列之后

给最后一个字段加逗号,保持数据一致>>给重复列设置高亮>>删除重复项(保留主表的字段)>>合并两个列的内容>>复制到oarcle的sql执行区

分列结果

给最后一个字段加逗号, 保持所有数据一致

合并2个列的内容>>  =第一个单元格地址"."第二个单元格地址

往下拖动

给宽表添加注释

DECLARE
   -- 宽表字段来源
   CURSOR COLS_LIST IS
    SELECT 
       *
    FROM DBA_COL_COMMENTS
    WHERE OWNER = 'DWD' 
    AND TABLE_NAME IN
     ('LN_LNP_CTRT_CBAPP','CI_CIPH_HIGH_CUST_INFO','CI_CIPH_HIGH_INDV_LEV_INFO','CI_CIPH_HIGH_PTY_ADDR_RELA');
    
    -- 宽表字段
    CURSOR MY_COL IS
      SELECT 
         COLUMN_NAME
      FROM DBA_TAB_COLS 
      WHERE OWNER = 'DWB'
      AND TABLE_NAME = 'HIGH_CUST_TAB';
      
      V_SQL VARCHAR2(3000);
BEGIN
  FOR V IN COLS_LIST LOOP    -----外层循环遍历COLS_LIST游标的字段及注释
    FOR X IN MY_COL LOOP     -----内层循环遍历MY_COL游标中的字段
      IF V.COLUMN_NAME = X.COLUMN_NAME THEN
        V_SQL := 'COMMENT ON COLUMN DWB.HIGH_CUST_TAB.'||V.COLUMN_NAME||' IS'||''''||V.COMMENTS||'''';
        EXECUTE IMMEDIATE V_SQL;
      END IF;
    END LOOP;
  END LOOP;
END;

分析

给表的每一个字段添加注释>>字段数量多>>PLSQL批量添加>>使用游标循环获取

2个游标:

1个是获取DWD用户指定表的字段的字段及注释

 1个是获取DWB用户宽表的字段

查询/获取字段注释>>DBA_COL_COMMENTS视图>>属于系统表,前面不需要加用户名;

基于DWD用户的表创建的宽表>>用 owner = 'DWD'过滤, 用 in 筛选想要的表

oracle中给表字段添加注释的语法

注意: 单引号在PLSQL中拼接时需要转义字符 '

;