历史拉链表「建议收藏」

历史拉链表「建议收藏」使用UDW创建历史拉链表。介绍历史拉链表历史拉链表是一种数据模型,主要针对数据仓库设计中表存储数据的方式而定义的。**它记录一个事物从开始到当前状态的所有变化的信息。**拉链表可以避免按每一天存储所有记录造成的海量存储问题,同时也是处理缓慢变化数据的一种常见方式。也就是说,对于表中的任何数据,不进行真正的删除,只记录操作和有效日期。流程其中,tmp0表有两个分区,表…

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

Jetbrains全系列IDE稳定放心使用

使用UDW创建历史拉链表。

介绍

  • 历史拉链表

    • 历史拉链表是一种数据模型,主要针对数据仓库设计中表存储数据的方式而定义的。**它记录一个事物从开始到当前状态的所有变化的信息。**拉链表可以避免按每一天存储所有记录造成的海量存储问题,同时也是处理缓慢变化数据的一种常见方式。
    • 也就是说,对于表中的任何数据,不进行真正的删除,只记录操作和有效日期。
  • 流程

    • 55253131334
    • 其中,tmp0表有两个分区,表示历史数据和当前数据,使用tmp1tmp0和事实表进行更新和交换。

操作

创建表

  • 首先需要创建delta表,事实表,以及两个tmp表

  • -- 事实表
    create table public.member_fatdt0
    (
        member_id varchar(64),         -- 会员ID
        phoneno varchar(20),           -- 电话号码
        dw_beg_date date,              -- 生效日期
        dw_end_date date,              -- 失效日期
        dtype char(1),                 -- 类型(历史数据,当前数据)
        dw_status char(1),             -- 数据操作类型(I,D,U)
        dw_ins_date date               -- 数据仓库插入日期
    )with(appendonly=true,compresslevel=5)   -- 压缩级别
    distributed by (member_id)
    PARTITION BY RANGE (dw_end_date)
    (
        PARTITION p20111201 START (date '2011-12-01') INCLUSIVE,
        PARTITION p20111202 START (date '2011-12-02') INCLUSIVE,
        PARTITION p20111203 START (date '2011-12-03') INCLUSIVE,
        PARTITION p20111204 START (date '2011-12-04') INCLUSIVE,
        PARTITION p20111205 START (date '2011-12-05') INCLUSIVE,
        PARTITION p20111206 START (date '2011-12-06') INCLUSIVE,
        PARTITION p20111207 START (date '2011-12-07') INCLUSIVE,
        PARTITION p20111231 START (date '2011-12-31') INCLUSIVE
        END (date '3001-01-01') EXCLUSIVE
    );
    
    -- 增量表
    create table public.member_delta
    (
        member_id varchar(64),
        phoneno varchar(20),
        action char(1),                      -- 数据操作类型(I,D,U)
        dw_ins_date date                     -- 类型(新增,删除,更新)
    )with(appendonly=true,compresslevel=5)   -- 压缩级别
    distributed by (member_id)
    
    -- 临时表
    create table public.member_tmp0
    (
        member_id varchar(64),
        phoneno varchar(20),
        dw_beg_date date,
        dw_end_date date,
        dtype char(1),
        dw_status char(1),
        dw_ins_date date
    )with(appendonly=true,compresslevel=5)   -- 压缩级别
    distributed by (member_id)
    PARTITION BY LIST (dtype)
    (
        PARTITION PHIS VALUES ('H'),      -- 表示历史信息
        PARTITION PCUR VALUES ('C'),      -- 表示当前信息
        DEFAULT PARTITION other
    );
    

    – 临时表1
    create table public.member_tmp1
    (
    member_id varchar(64),
    phoneno varchar(20),
    dw_beg_date date,
    dw_end_date date,
    dtype char(1),
    dw_status char(1),
    dw_ins_date date
    )with(appendonly=true,compresslevel=5) – 压缩级别
    distributed by (member_id)

    
    
  • 55252699017

插入数据

  • 插入delta表

    • Insert into member_delta values('mem006','1310000006','I','2011-12-03');
      Insert into member_delta values('mem002','1310000002','D','2011-12-03');
      Insert into member_delta values('mem003','1310000003','U','2011-12-03');
      
    
    - ![55252708610](http://wx4.sinaimg.cn/mw690/0060lm7Tly1g124h8xtgtj30al02w0sk.jpg)
    
    
  • 插入事实表

    • Insert into member_fatdt0 values('mem001','1310000001','2011-12-01','3000-12-31','C','I','2011-12-02');
      Insert into member_fatdt0 values('mem002','1310000002','2011-12-01','3000-12-31','C','I','2011-12-02');
      Insert into member_fatdt0 values('mem003','1310000003','2011-12-01','3000-12-31','C','I','2011-12-02');
      Insert into member_fatdt0 values('mem004','1310000004','2011-12-01','3000-12-31','C','I','2011-12-02');
      Insert into member_fatdt0 values('mem004','1310000004','2011-12-01','3000-12-31','C','I','2011-12-02');
      Insert into member_fatdt0 values('mem005','1310000005','2011-12-01','3000-12-31','C','I','2011-12-02');
      
    • 55252707255

数据刷新

  1. 将member_fatdt0表与member_delta左外连接,相关联的历史数据插入到member_tmp0历史分区,反之插入到member_tmp0的当前分区

    • 这里主要处理update和delete操作,若能进行左连接,说明数据有更新,插入历史分区

    • truncate table public.member_tmp0;
      -- 清理临时表
      insert into public.member_tmp0
      (
          member_id,
          phoneno,
          dw_beg_date,
          dw_end_date,
          dtype,
          dw_status,
          dw_ins_date
      )
      select a.member_id,a.phoneno,a.dw_beg_date,
              case when b.member_id is null then a.dw_end_date
              else date '2011-12-02'
              end as dw_end_date,
              case when b.member_id is null then 'C'
              else 'H'
              end as dtype,
              case when b.member_id is null then a.dw_status
              else b.action
              end as dw_status,
              date '2011-12-03'
      from public.member_fatdt0 a
      left join public.member_delta b 
      on a.member_id = b.member_id
      and b.action in('D','U')
      where a.dw_beg_date <= cast('2011-12-02' as date) -1
      and a.dw_end_date > cast('2011-12-02' as date)-1;
      
    • 55252723553

  2. 将member_delta当前数据(更新,插入的新数据)插入到member_tmp0当前分区,end时间为无穷。

    • insert into public.member_tmp0
      (
          member_id,
          phoneno,
          dw_beg_date,
          dw_end_date,
          dtype,
          dw_status,
          dw_ins_date
      )
      select member_id,phoneno,
          cast('2011-12-02' as date),
          cast('3000-12-31' as date),
          'C',
          action,
          cast('2011-12-03' as date)
      from public.member_delta
      where action in ('I','U');
      
      
    • 55252858777

  3. 将member_tmp0历史数据与member_fatdt0相应分区交换(通过member_tmp1表进行交换)。

    • alter table  member_tmp1 drop constraint member_tmp0_1_prt_phis_check;
      truncate table public.member_tmp1;
      alter table public.member_tmp0 exchange partition for ('H') with table public.member_tmp1;
      alter table public.member_fatdt0 exchange partition for('2011-12-02') with table public.member_tmp1;
      
      • 55252886260
  4. 将member_tmp0当前数据与member_fatdt0相应分区交换(通过member_tmp1表进行交换)。

    • alter table  member_tmp1 drop constraint member_fatdt0_1_prt_p20111202_check
      alter table  member_tmp1 drop constraint member_tmp0_1_prt_pcur_check
      alter table public.member_tmp0 exchange partition for('C') with table public.member_tmp1;
      alter table public.member_fatdt0 exchange partition for('3000-12-31') with table public.member_tmp1;
      
    • 55252945525

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 根文件系统使用登录模式「建议收藏」

    根文件系统使用登录模式

    2022年1月30日
    50
  • 云游戏、VR、AI,云计算给元宇宙提供了哪些想象力?「建议收藏」

    云游戏、VR、AI,云计算给元宇宙提供了哪些想象力?「建议收藏」2021最火的新概念,莫过于元宇宙。2021年10月29日,Facebook宣布改名Meta;2021年11月1日,“元宇宙第一股”Roblox经过短暂调整,宣布重新上线。接下来关于元宇宙的线下/线上讨论如火如荼,元宇宙概念的热度可见一斑。1.逐层拆解元宇宙清华大学新闻学院教授、博士生导师沈阳教授在一场活动中分享道,元宇宙,英文是Metaverse,从字面来理解,由Meta(超越)和Universe(宇宙)两部分组成。而沈阳教授团队也给元宇宙下了一个相对

    2022年5月30日
    34
  • interface gigabitethernet1/0/1_onboard ethernet controller

    interface gigabitethernet1/0/1_onboard ethernet controllerinterfaceEthernet0/0/0 1. x/y/z表示:第x台设备、第y板卡、第z端口,其中z是可以在同设备、同板卡上重复出现的,但分别对应Fastethernet(百兆端口)和Gibgaitethernet(千兆端口)。2.这种表现形式只在命令行中出现,具体设备商一般只能表示z,因为x表示的是第几台级联设备,y则表示设备商插的第几块板卡。如果你面对的只是一台设备,则x永…

    2025年8月2日
    5
  • mac不用U盘装双系统_mac双系统安装不用u盘

    mac不用U盘装双系统_mac双系统安装不用u盘U盘安装MAC双系统的方法:  第一步: 最好具备两个个4G以上容量的u盘。注意里面不要放任何东东,到时在mac中制作win7启动盘时会全无的。还有就是win7的镜像文件(最好安装64位系统)。  mac里面下载win7系统下的mac硬件驱动。  下载步骤:打开BootCamp后点击继续!  再就只需要把中间的钩上,上下两个框框先不勾!这个就是用mac下载

    2022年10月5日
    6
  • linux 搜狗输入法包名,搜狗输入法[通俗易懂]

    linux 搜狗输入法包名,搜狗输入法[通俗易懂]应用介绍搜狗输入法,拥有高效优质中文词库,输入更加准确,智能。搜狗智能旺仔带你用AI表达,斗图,妙语,输入更加有趣。******特色功能******【搜狗专属高效词库】搜狗多年积累,百万级中文系统词库,输入首选更准确【优选云词库】新词汇、热门网络语、热门流行语、饭圈新密语实时更新,跟上时髦的你【智能长句输入】只需输入几个字母,就能猜中你要说的话,准确补全,省时省力【AI智能汪仔】AI输入用搜狗,智…

    2022年7月26日
    4
  • Oracle触发器和事务[通俗易懂]

    Oracle触发器和事务[通俗易懂] oracle触发器和事务2015年11月24日14:16:43 it_taojingzhan 阅读数:320编写触发器时,需要注意以下几点:l        触发器不接受参数。l        一个表上最多可有12个触发器,但同一时间、同一事件、同一类型的触发器只能有一个。并各触发器之间不能有矛盾。l        在一个表上的触发器越多,对在该表上的DML操作的性能影…

    2022年7月27日
    11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号