• 拉链表的展开算法


    在做数据仓库项目的过程中,有时候可能也会根据历史拉链表,展开为每天全量表;相当于一个还原的过程,即构建拉链表的反过程。

    1、 建表及插入测试数据语句

    1. --建表语句
    2. --生成EDW_T00_H表(历史拉链表)
    3. -- Create table
    4. create table EDW_T00_H
    5. (
    6. ID VARCHAR2(2) not null,
    7. START_DATE DATE not null,
    8. STATUS VARCHAR2(2),
    9. END_DATE DATE
    10. );
    11. -- Add comments to the table
    12. comment on table EDW_T00_H
    13. is '历史拉链表';
    14. -- Add comments to the columns
    15. comment on column EDW_T00_H.ID
    16. is 'ID';
    17. comment on column EDW_T00_H.START_DATE
    18. is '开始日期';
    19. comment on column EDW_T00_H.STATUS
    20. is '状态';
    21. comment on column EDW_T00_H.END_DATE
    22. is '结束日期';
    23. -- Create/Recreate primary, unique and foreign key constraints
    24. alter table EDW_T00_H
    25. add constraint EDW_T00_ID primary key (ID, START_DATE);
    26. --生成EDW_T00_ALL表(历史拉链展开后的表)
    27. -- Create table
    28. create table EDW_T00_ALL
    29. (
    30. ID VARCHAR2(2) not null,
    31. DATA_DATE DATE not null,
    32. STATUS VARCHAR2(2) not null
    33. );
    34. -- Add comments to the table
    35. comment on table EDW_T00_ALL
    36. is '历史拉链展开后的表';
    37. -- Add comments to the columns
    38. comment on column EDW_T00_ALL.ID
    39. is 'ID';
    40. comment on column EDW_T00_ALL.DATA_DATE
    41. is '数据日期';
    42. comment on column EDW_T00_ALL.STATUS
    43. is '状态';
    44. --插入历史表测试数据
    45. insert into edw_t00_H (ID, START_DATE, STATUS, END_DATE)
    46. values ('3', to_date('01-12-2007', 'dd-mm-yyyy'), 'N', to_date('01-12-2009', 'dd-mm-yyyy'));
    47. insert into edw_t00_H (ID, START_DATE, STATUS, END_DATE)
    48. values ('3', to_date('01-12-2009', 'dd-mm-yyyy'), 'Y', to_date('16-12-2010', 'dd-mm-yyyy'));
    49. insert into edw_t00_H (ID, START_DATE, STATUS, END_DATE)
    50. values ('1', to_date('01-12-2010', 'dd-mm-yyyy'), 'Y', to_date('16-12-2010', 'dd-mm-yyyy'));
    51. insert into edw_t00_H (ID, START_DATE, STATUS, END_DATE)
    52. values ('2', to_date('01-12-2010', 'dd-mm-yyyy'), 'N', to_date('12-12-2010', 'dd-mm-yyyy'));
    53. COMMIT;

    2、 插入系统维护日期表

    主要用来取ROWNUM供第3步操作

    1. --插入系统维护时间
    2. CREATE TABLE SYS_MATIAN_DATE(DATE_COL DATE);
    3. DECLARE
    4. V_DATE DATE := TO_DATE('20080101', 'YYYYMMDD');
    5. V_DATE_MAX DATE;
    6. BEGIN
    7. EXECUTE IMMEDIATE 'TRUNCATE TABLE SYS_MATIAN_DATE';
    8. SELECT SYSDATE INTO V_DATE_MAX FROM DUAL;
    9. WHILE V_DATE <= V_DATE_MAX LOOP
    10. INSERT INTO SYS_MATIAN_DATE
    11. SELECT V_DATE FROM DUAL;
    12. V_DATE := V_DATE + 1;
    13. COMMIT;
    14. END LOOP;
    15. END;
    16. SELECT * FROM SYS_MATIAN_DATE;

    3、 实现拉链表展开的代码

    1. DECLARE
    2. CURSOR LSLL_ID IS
    3. SELECT ID,
    4. START_DATE,
    5. STATUS,
    6. DECODE(END_DATE,
    7. TO_DATE('30001231', 'YYYYMMDD'),
    8. SYSDATE, --TO_DATE(P_ETLDATE, 'YYYYMMDD'),
    9. END_DATE) END_DATE
    10. FROM EDW_T00_H;
    11. V_ID VARCHAR2(1000);
    12. V_START_DATE DATE;
    13. V_END_DATE DATE;
    14. V_DATA_DATE DATE;
    15. V_STATUS VARCHAR2(2);
    16. BEGIN
    17. BEGIN
    18. EXECUTE IMMEDIATE 'TRUNCATE TABLE EDW_T00_ALL';
    19. OPEN LSLL_ID;
    20. LOOP
    21. FETCH LSLL_ID
    22. INTO V_ID, V_START_DATE, V_STATUS, V_END_DATE;
    23. EXIT WHEN LSLL_ID%NOTFOUND;
    24. INSERT INTO EDW_T00_ALL
    25. (ID, DATA_DATE, STATUS)
    26. SELECT V_ID, V_START_DATE + ROWNUM - 1 AS DATA_DATE, V_STATUS
    27. FROM SYS_MATIAN_DATE
    28. WHERE V_START_DATE + ROWNUM - 1 < V_END_DATE;
    29. COMMIT;
    30. END LOOP;
    31. CLOSE LSLL_ID;
    32. END;
    33. END;

    4、 总结说明

    第3步中,游标的START_DATE、END_DATE要根据实际情况,灵活变通;代码的EXECUTE IMMEDIATE 'TRUNCATE TABLE EDW_T00_ALL';需要不需要,根据实际情况来定;第2步中生成数据日期维护表,主要用来第3步

    1. SELECT V_ID, V_START_DATE + ROWNUM - 1 AS DATA_DATE, V_STATUS
    2. FROM SYS_MATIAN_DATE
    3. WHERE V_START_DATE + ROWNUM - 1 < V_END_DATE;

    取数用,目的是保证SYS_MATIAN_DATE表有足够的记录,以使对于每一条历史拉链表中的记录都能取得到;本文给出了我们进行拉链表展开时的一个思路。

  • 相关阅读:
    基于Taro开发京东小程序小记
    【程序进程及相关命令】
    vue实现div拖拽
    物联网手势控制小车所遇问题与解决方案
    一文简要了解星闪技术优势点
    【C语言】顺序表(上卷)
    题目0056-员工出勤
    基于Springboot开发实现二手交易商城
    Json格式解析
    [附源码]JAVA毕业设计日常办公管理系统(系统+LW)
  • 原文地址:https://blog.csdn.net/BabyFish13/article/details/133644427