前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >拉链表的展开算法_如何求展开式的系数

拉链表的展开算法_如何求展开式的系数

作者头像
全栈程序员站长
发布2022-11-03 15:43:04
3360
发布2022-11-03 15:43:04
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。 Jetbrains全系列IDE稳定放心使用

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

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

代码语言:javascript
复制
--建表语句  
--生成EDW_T00_H表(历史拉链表)  
-- Create table  
create table EDW_T00_H  
(  
  ID         VARCHAR2(2) not null,  
  START_DATE DATE not null,  
  STATUS     VARCHAR2(2),  
  END_DATE   DATE  
);  
代码语言:javascript
复制
-- Add comments to the table   
comment on table EDW_T00_H  
  is '历史拉链表';  
-- Add comments to the columns   
comment on column EDW_T00_H.ID  
  is 'ID';  
comment on column EDW_T00_H.START_DATE  
  is '开始日期';  
comment on column EDW_T00_H.STATUS  
  is '状态';  
comment on column EDW_T00_H.END_DATE  
  is '结束日期';  
代码语言:javascript
复制
-- Create/Recreate primary, unique and foreign key constraints   
alter table EDW_T00_H  
  add constraint EDW_T00_ID primary key (ID, START_DATE);  
--生成EDW_T00_ALL表(历史拉链展开后的表)  
-- Create table  
create table EDW_T00_ALL  
(  
  ID        VARCHAR2(2) not null,  
  DATA_DATE DATE not null,  
  STATUS    VARCHAR2(2) not null  
);  
代码语言:javascript
复制
-- Add comments to the table   
comment on table EDW_T00_ALL  
  is '历史拉链展开后的表';  
-- Add comments to the columns   
comment on column EDW_T00_ALL.ID  
  is 'ID';  
comment on column EDW_T00_ALL.DATA_DATE  
  is '数据日期';  
comment on column EDW_T00_ALL.STATUS  
  is '状态';  
代码语言:javascript
复制
--插入历史表测试数据  
insert into edw_t00_H (ID, START_DATE, STATUS, END_DATE)  
values ('3', to_date('01-12-2007', 'dd-mm-yyyy'), 'N', to_date('01-12-2009', 'dd-mm-yyyy'));  
insert into edw_t00_H (ID, START_DATE, STATUS, END_DATE)  
values ('3', to_date('01-12-2009', 'dd-mm-yyyy'), 'Y', to_date('16-12-2010', 'dd-mm-yyyy'));  
insert into edw_t00_H (ID, START_DATE, STATUS, END_DATE)  
values ('1', to_date('01-12-2010', 'dd-mm-yyyy'), 'Y', to_date('16-12-2010', 'dd-mm-yyyy'));  
insert into edw_t00_H (ID, START_DATE, STATUS, END_DATE)  
values ('2', to_date('01-12-2010', 'dd-mm-yyyy'), 'N', to_date('12-12-2010', 'dd-mm-yyyy'));  
COMMIT;  

2、 插入系统维护日期表

代码语言:javascript
复制
主要用来取ROWNUM供第3步操作

--插入系统维护时间  
CREATE TABLE SYS_MATIAN_DATE(DATE_COL DATE);  
  
DECLARE  
  V_DATE     DATE := TO_DATE('20080101', 'YYYYMMDD');  
  V_DATE_MAX DATE;  
BEGIN  
  EXECUTE IMMEDIATE 'TRUNCATE TABLE SYS_MATIAN_DATE';  
  SELECT SYSDATE INTO V_DATE_MAX FROM DUAL;  
  WHILE V_DATE <= V_DATE_MAX LOOP  
    INSERT INTO SYS_MATIAN_DATE  
      SELECT V_DATE FROM DUAL;  
    V_DATE := V_DATE + 1;  
    COMMIT;  
  END LOOP;  
END;  
  
SELECT * FROM SYS_MATIAN_DATE;  

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

代码语言:javascript
复制
DECLARE  
  CURSOR LSLL_ID IS  
    SELECT ID,  
           START_DATE,  
           STATUS,  
           DECODE(END_DATE,  
                  TO_DATE('30001231', 'YYYYMMDD'),  
                  SYSDATE,      --TO_DATE(P_ETLDATE, 'YYYYMMDD'),  
                  END_DATE) END_DATE  
      FROM EDW_T00_H;  
  V_ID         VARCHAR2(1000);  
  V_START_DATE DATE;  
  V_END_DATE   DATE;  
  V_DATA_DATE  DATE;  
  V_STATUS     VARCHAR2(2);  
BEGIN  
  BEGIN  
    EXECUTE IMMEDIATE 'TRUNCATE TABLE EDW_T00_ALL';  
    OPEN LSLL_ID;  
    LOOP  
      FETCH LSLL_ID  
        INTO V_ID, V_START_DATE, V_STATUS, V_END_DATE;  
      EXIT WHEN LSLL_ID%NOTFOUND;  
      INSERT INTO EDW_T00_ALL  
        (ID, DATA_DATE, STATUS)  
        SELECT V_ID, V_START_DATE + ROWNUM - 1 AS DATA_DATE, V_STATUS  
          FROM SYS_MATIAN_DATE  
         WHERE V_START_DATE + ROWNUM - 1 < V_END_DATE;  
      COMMIT;  
    END LOOP;  
    CLOSE LSLL_ID;  
  END;  
END;  

4、 总结说明

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

SELECT V_ID, V_START_DATE + ROWNUM - 1 AS DATA_DATE, V_STATUS

          FROM SYS_MATIAN_DATE

         WHERE V_START_DATE + ROWNUM - 1 < V_END_DATE;

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/181372.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档