点击上方蓝色字体,置顶/星标哦

目前10000+人已关注加入我们


拉链表是一种数据模型,主要是针对数据仓库设计中表存储数据的方式而定义的;顾名思义,所谓拉链表,就是记录历史,记录一个事务从开始一直到当前状态的所有变化的信息。

拉链表可以避免按每一天存储所有记录造成的海量存储问题,同时也是处理缓慢变化数据(SCD2)的一种常见方式。

一、概念原理

  在拉链表中,每一条数据都有一个生效日期(sdate) 和 失效日期(edate)。假设在一个用户表中,在 2019年10月8日 新增了两个用户,则这两条记录的生效时间为当天,由于到 2019年10月8日 为止,这两条记录还没有被修改过,所以失效时间为无穷大,这里设置为数据库中的最大值(2999-12-31),如图所示:

第二天(2019-10-09),用户 1001 被删除,用户 1002 的电话号码被修改成 16500000006。为了保留历史状态,用户 1001 的失效时间被修改成 2019-10-09,用户 1002 则变成两条记录,如图所示:

第三天(2019-10-10),又新增了用户 1003,则用户表数据如图:

如果要查询最新的数据,那么只要查询失效时间为 2999-12-31 的数据即可,如果要查询 10月8号 的历史数据,则筛选生效时间 <= 2019-10-08 并且失效时间 > 2019-10-08 的数据即可;如果查询的是 10月9日的数据,那么筛选条件则是生效时间 <= 2019-10-09 并且失效时间 > 2019-10-09;以此类推。

二、准备

2.1 创建表 

临时源表 T_FIN_ACCTION_SRC,接收其它数据库(如 oracle)表推送过来的数据 ,表结构和源数据库的表结构一致

目标表 ( 即拉链表 ) T_FIN_ACCTION_TAR,这里注意的是:拉链表把源表的时间字段改成了 生效时间 和 失效时间 哦

2.2 创建存储过程 

  在这里为了方便阅读以及代码的编写,先写出整体的存储过程架构,然后我们在一步一步添加代码:

-- 将当前时间传入 (也可以传入昨天的时间哦,随机应变,

-- 如果传入的时间是今天则使用中要将时间减1,因为我们要处理的是昨天的数据)

create or replace function My_FIN_GL_SUBJECT_PRO(IN P_TODAY VARCHAR)    returns voidas $$declare

begin               --1.目标表中没有此主键的则确定为新增  -  新增

            --2.源表中没有该ID则进行关链  -  删除

            --3.修改            --3.1 闭链:目标表中有此主键的记录,状态值不同,更新结束日期为当天

            --3.2 开链:目标表中新增一条修改的数据,更新结束日期为无穷大

end;$$language plpgsql;

三、拉链实现过程

3.1 新增 
目标表中没有此主键的则确定为新增 - 新增
insert into gplcydb.public.T_FIN_ACCTION_TAR(eNo,eName,ePhone,sdate,edate)

select s.eNo,s.eName,s.ePhone,s.eData_date,to_date('2999-12-31','yyyy-mm-dd')

  from gplcydb.public.T_FIN_ACCTION_SRC s where s.eData_date=(to_date(P_TODAY,'yyyy-mm-dd') - 1)   and not exists(                   select 1 

                     from gplcydb.public.T_FIN_ACCTION_TAR t

                    where s.eNo=t.eNo                      and s.eName=t.eName                      and s.ePhone=t.ePhone                  );

3.2 删除 
源表中没有该ID则进行关链 - 删除
update gplcydb.public.T_FIN_ACCTION_TAR a

  set edate=(to_date(P_TODAY,'yyyy-mm-dd')-1)

where not exists(                  select 1 

                    from gplcydb.public.T_FIN_ACCTION_SRC s

                   where s.eNo=a.eNo                     and a.edate=to_date('2999-12-31', 'yyyy-mm-dd')                );

3.3 修改 

1) 闭链:目标表中有此主键的记录,状态值不同,更新结束日期为当天

update gplcydb.public.T_FIN_ACCTION_TAR b

   set edate=(to_date(P_TODAY,'yyyy-mm-dd')-1)

 where b.edate=to_date('2999-12-31','yyyy-mm-dd')   and exists(               select 1 

                 from gplcydb.public.T_FIN_ACCTION_SRC s

                where s.eNo = b.eNo

                  and b.sdate < (to_date(P_TODAY,'yyyy-mm-dd')-1)

                  and ( s.eName <> b.eName or s.ePhone <> b.ePhone )              )

;

2) 开链:目标表中新增一条修改的数据,更新结束日期为无穷大

insert into gplcydb.public.T_FIN_ACCTION_TAR(eNo,eName,ePhone,sdate,edate)select s.eNo,s.eName,s.ePhone,(to_date(P_TODAY,'yyyy-mm-dd') - 1),to_date('2999-12-31','yyyy-mm-dd')  from gplcydb.public.T_FIN_ACCTION_SRC s where s.eData_date=(to_date(P_TODAY,'yyyy-mm-dd') - 1)  and exists( -- 处理数据断链新增的情况              select 1 

                from (

                        select eNo,sdate,max(edate) end_date                          from gplcydb.public.T_FIN_ACCTION_TAR 

                         group by eNo,sdate

                      ) t

               where t.eNo=s.eNo                 and s.eData_date = t.sdate                 and t.end_date <= to_date(P_TODAY,'yyyy-mm-dd')            )

;

四、测试

要测试拉链函数,首先我们必须要在原表中插入数据(模拟一天全量的数据):

insert into T_FIN_ACCTION_SRC values('1001','feiniu','18500000001','2019-10-10');insert into T_FIN_ACCTION_SRC values('1002','beibei','18400000005','2019-10-10');insert into T_FIN_ACCTION_SRC values('1003','yuyu','13800000005','2019-10-10');

调用函数进行拉链测试:

select My_FIN_GL_SUBJECT_PRO('2019-10-11');  -- 调用函数

select * from T_FIN_ACCTION_TAR;             -- 查询拉链表

测试结果如下图:

  插入第二天全量数据,这些数据中有新增的数据,有源数据被删除,还有源数据被修改,完整的模拟sql语句如下:

delete from T_FIN_ACCTION_SRC where eno='1003';insert into T_FIN_ACCTION_SRC values('1004','kongkong','13800000666','2019-10-11');update T_FIN_ACCTION_SRC set ename='xiaofeifei' where eno='1001';

select * from T_FIN_ACCTION_SRC;

原表的效果图如下:

接下来执行拉链函数:

-- 执行拉链函数select My_FIN_GL_SUBJECT_PRO('2019-10-12');

select * from T_FIN_ACCTION_TAR;  --查询目标表

效果图如下:

  到此,我们的拉链实现就完成咯,当初还用了很多个临时表,琢磨了好久终于可以实现了,希望能帮助到你!如果对你有用可以给我赞哦~ 原创不易,谢谢!


http://www.taodudu.cc/news/show-2975611.html

相关文章:

  • Apache拯救世界之数据质量监控工具 - Apache Griffin
  • 每日学习 与 每日未知
  • TCP传输
  • 24 张图总结 TCP 基础知识,看完我飘了。
  • 去掉Holo主题下Dialog的蓝色线
  • TCP标志位syn,ack,fin以及序列号(seq),响应号(ack)
  • 基于springboot的手办定制销售系统毕业设计源码031800
  • SSM基于WEB的房屋出租管理系统 毕业设计-附源码261620
  • springboot基于微信小程序的电器商城系统的设计与实现毕业设计源码251453
  • Springboot自行车网上商城毕业设计-附源码130948
  • 基于Springboot的特产销售平台设计与实现毕业设计源码091036
  • springboot基于JAVA游戏周边商城设计与实现毕业设计源码261622
  • Springboot游戏道具在线交易平台毕业设计源码171956
  • Springboot+基于微信小程序的电器商城系统的设计与实现 毕业设计-附源码251453
  • springboot罗亚方舟考研资料库网站设计与实现毕业设计源码302302
  • php社区果蔬网站毕业设计源码211548
  • 电商环境下中小企业客户关系管理系统设计
  • 【一周头条盘点】中国软件网(2018.8.20~2018.8.24)
  • 网络游戏软件销售渠道模式举例及分析
  • 【渝粤题库】广东开放大学 互联网金融 形成性考核
  • 超详细零信任市场解读
  • 用ENSP华为模拟器做图书馆得网络配置和设计
  • 新华社客户端文章:区块链金融:新蓝海还是新挑战
  • 利用python进行AdaBoost模型预测
  • factor java_使用randomForest,Caret和factor变量预测栅格时出错
  • XGBoost参数调优完全指南(附Python代码)
  • Kaggle实战(一):泰坦尼克获救预测
  • 第十章 决策树与随机森林
  • [论文笔记]slope one predictors for online rating-based collaborative filtering
  • Images Aesthetic Predictors Based on Weighted CNNs 论文翻译解读

系列 | 数仓实践第三篇NO.3『拉链表』相关推荐

  1. 系列 | 漫谈数仓第四篇NO.4 『数据应用』(BIOLAP)

    点击上方蓝色字体,置顶/星标哦 目前10000+人已关注加入我们 本文目录CONTENTS ☞ 01.可视化BI工具 [ 开源BI,商业BI,传统BI ] ☞ 02.OLAP科普 [ ROLAP  M ...

  2. 数仓维度建模系列-数仓规范篇

    本系列将持续更新数仓建模相关知识,将学习到的理论知识和工作实践结合起来,总结沉淀下来,积跬步成千里. 上一篇介绍了维度建模体系的搭建,这次来分享下搭建数据仓库涉及的各种规范. 分享我工作中遇到的一个小 ...

  3. 基于 Impala 的高性能数仓实践之物化视图服务

    本文将主要介绍 NDH Impala 的物化视图实现. 接上篇讲到了虚拟数仓,它们是让一个 SQL 又快又好地执行的关键.但如果某些 SQL 过于复杂,比如多张大表进行 Join 并有大量的聚合类操作 ...

  4. matlab实现鬼波信号压制算法  代码实践--第三篇 拉东域鬼波压制

    第三篇 matlab实现 拉东域鬼波压制方法 本篇用来介绍拉东域鬼波压制的实现思路和压制效果 该方法可用于水平拖缆.斜缆数据的鬼波压制 算法实现思路见3.3节,除了文中代码外,需配置鬼波压制算法工具包 ...

  5. Flink 1.11 与 Hive 批流一体数仓实践

    导读:Flink 从 1.9.0 开始提供与 Hive 集成的功能,随着几个版本的迭代,在最新的 Flink 1.11 中,与 Hive 集成的功能进一步深化,并且开始尝试将流计算场景与Hive 进行 ...

  6. hive表ddl导出_Flink 1.11 与 Hive 批流一体数仓实践

    简介:Flink 从 1.9.0 开始提供与 Hive 集成的功能,随着几个版本的迭代,在最新的 Flink 1.11 中,与 Hive 集成的功能进一步深化,并且开始尝试将流计算场景与Hive 进行 ...

  7. 游戏数仓分析(三)SpringBoot项目对数据进行可视化展示,每日注册用户

    在游戏数仓分析(二)SpringBoot项目对数据进行可视化展示中已经做出一定的演示:https://georgedage.blog.csdn.net/article/details/10327840 ...

  8. ▼ 系列 | 漫谈数仓第四篇NO.4 『BI选型』

    大数据时代商业智能(BI)和数据可视化诉求更为强烈,淘宝大屏更是风靡全球!数据可视化是大数据『最后一公里』,BI唤醒沉睡的数据. 传统型BI力求大而全的统一综合型报表和分析平台,侧重传统式报表开发,俨 ...

  9. HAWQ取代传统数仓实践(十)——维度表技术之杂项维度

    一.什么是杂项维度 简单地说,杂项维度就是一种包含的数据具有很少可能值的维度.事务型商业过程通常产生一系列混杂的.低基数的标志位或状态信息.与其为每个标志或属性定义不同的维度,不如建立单独的将不同维度 ...

最新文章

  1. c语言教程常用32,几个常用运算符
  2. 中点坐标公式 矩形_压轴题必备|中考数学“动点坐标”问题,这个万能解法人人都能学会!...
  3. vsftp 无法启动,500 OOPS: bad bool value in config file for: anonymous_enable
  4. 多线程,并发,异步,死锁
  5. ConfirmCancelUtilDialog【确认取消对话框封装类】
  6. 广告拦截之easylist和easylistchina订阅地址
  7. 大数据学习笔记:HBase Shell操作
  8. dynamips虚拟服务:找不到指定设备
  9. mtk6592处理器怎么样,mtk6592参考设计原理图下载
  10. TIA博途中如何通过Prodiag功能制作报警并显示在HMI上?
  11. R 语言绘制带组的圆形条形图
  12. iOS开发——使用Charles进行http网络抓包详解
  13. 普通石粉的用途_石粉在建筑业上有什么用途
  14. UIView 绘制渲染机制
  15. 苹果平板如何截屏_原来苹果手机自带长截屏功能!以前一直不知道,真让人相见恨晚...
  16. 如何做好网络推广浅析SEO优化网站文章需要注意哪些技巧?
  17. 《电子基础与维修工具核心教程》——导读
  18. 爱不是一个坚强的理由
  19. 创意影响:为什么色彩准确的视频编辑监视器很重要
  20. 项目马上就告一段落了

热门文章

  1. 塞班s60v3手电筒sisx_塞班s60v3闪光灯手电筒软件可以发给我吗?谢谢!
  2. 系统学习iOS动画 —— 渐变动画
  3. Unity-ShaderGraph学习笔记第一步: 如何打开ShaderGraph 制作全息效果Shader
  4. Git连接oschina管理代码版本
  5. React页面空白问题
  6. 风险预测模型_慢性肾脏病孕妇妊娠风险预测模型的构建及验证
  7. 【北京迅为iMX6ULL】嵌入式学习之Linux系统编程视频教程
  8. php采集喜马拉雅,喜马拉雅数据 JSSDK API 接入 demo WEB版 标准登录 、免登陆
  9. c语言设计奥运奖牌管理系统,求一个用C语言编程的奥运奖牌管理系统
  10. SCA可达性分析基础知识普及