系列 | 数仓实践第三篇NO.3『拉链表』
点击上方蓝色字体,置顶/星标哦
目前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;以此类推。
二、准备
临时源表 T_FIN_ACCTION_SRC,接收其它数据库(如 oracle)表推送过来的数据 ,表结构和源数据库的表结构一致
目标表 ( 即拉链表 ) T_FIN_ACCTION_TAR,这里注意的是:拉链表把源表的时间字段改成了 生效时间 和 失效时间 哦
在这里为了方便阅读以及代码的编写,先写出整体的存储过程架构,然后我们在一步一步添加代码:
-- 将当前时间传入 (也可以传入昨天的时间哦,随机应变,
-- 如果传入的时间是今天则使用中要将时间减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;
三、拉链实现过程
目标表中没有此主键的则确定为新增 - 新增
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 );
源表中没有该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') );
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『拉链表』相关推荐
- 系列 | 漫谈数仓第四篇NO.4 『数据应用』(BIOLAP)
点击上方蓝色字体,置顶/星标哦 目前10000+人已关注加入我们 本文目录CONTENTS ☞ 01.可视化BI工具 [ 开源BI,商业BI,传统BI ] ☞ 02.OLAP科普 [ ROLAP M ...
- 数仓维度建模系列-数仓规范篇
本系列将持续更新数仓建模相关知识,将学习到的理论知识和工作实践结合起来,总结沉淀下来,积跬步成千里. 上一篇介绍了维度建模体系的搭建,这次来分享下搭建数据仓库涉及的各种规范. 分享我工作中遇到的一个小 ...
- 基于 Impala 的高性能数仓实践之物化视图服务
本文将主要介绍 NDH Impala 的物化视图实现. 接上篇讲到了虚拟数仓,它们是让一个 SQL 又快又好地执行的关键.但如果某些 SQL 过于复杂,比如多张大表进行 Join 并有大量的聚合类操作 ...
- matlab实现鬼波信号压制算法 代码实践--第三篇 拉东域鬼波压制
第三篇 matlab实现 拉东域鬼波压制方法 本篇用来介绍拉东域鬼波压制的实现思路和压制效果 该方法可用于水平拖缆.斜缆数据的鬼波压制 算法实现思路见3.3节,除了文中代码外,需配置鬼波压制算法工具包 ...
- Flink 1.11 与 Hive 批流一体数仓实践
导读:Flink 从 1.9.0 开始提供与 Hive 集成的功能,随着几个版本的迭代,在最新的 Flink 1.11 中,与 Hive 集成的功能进一步深化,并且开始尝试将流计算场景与Hive 进行 ...
- hive表ddl导出_Flink 1.11 与 Hive 批流一体数仓实践
简介:Flink 从 1.9.0 开始提供与 Hive 集成的功能,随着几个版本的迭代,在最新的 Flink 1.11 中,与 Hive 集成的功能进一步深化,并且开始尝试将流计算场景与Hive 进行 ...
- 游戏数仓分析(三)SpringBoot项目对数据进行可视化展示,每日注册用户
在游戏数仓分析(二)SpringBoot项目对数据进行可视化展示中已经做出一定的演示:https://georgedage.blog.csdn.net/article/details/10327840 ...
- ▼ 系列 | 漫谈数仓第四篇NO.4 『BI选型』
大数据时代商业智能(BI)和数据可视化诉求更为强烈,淘宝大屏更是风靡全球!数据可视化是大数据『最后一公里』,BI唤醒沉睡的数据. 传统型BI力求大而全的统一综合型报表和分析平台,侧重传统式报表开发,俨 ...
- HAWQ取代传统数仓实践(十)——维度表技术之杂项维度
一.什么是杂项维度 简单地说,杂项维度就是一种包含的数据具有很少可能值的维度.事务型商业过程通常产生一系列混杂的.低基数的标志位或状态信息.与其为每个标志或属性定义不同的维度,不如建立单独的将不同维度 ...
最新文章
- c语言教程常用32,几个常用运算符
- 中点坐标公式 矩形_压轴题必备|中考数学“动点坐标”问题,这个万能解法人人都能学会!...
- vsftp 无法启动,500 OOPS: bad bool value in config file for: anonymous_enable
- 多线程,并发,异步,死锁
- ConfirmCancelUtilDialog【确认取消对话框封装类】
- 广告拦截之easylist和easylistchina订阅地址
- 大数据学习笔记:HBase Shell操作
- dynamips虚拟服务:找不到指定设备
- mtk6592处理器怎么样,mtk6592参考设计原理图下载
- TIA博途中如何通过Prodiag功能制作报警并显示在HMI上?
- R 语言绘制带组的圆形条形图
- iOS开发——使用Charles进行http网络抓包详解
- 普通石粉的用途_石粉在建筑业上有什么用途
- UIView 绘制渲染机制
- 苹果平板如何截屏_原来苹果手机自带长截屏功能!以前一直不知道,真让人相见恨晚...
- 如何做好网络推广浅析SEO优化网站文章需要注意哪些技巧?
- 《电子基础与维修工具核心教程》——导读
- 爱不是一个坚强的理由
- 创意影响:为什么色彩准确的视频编辑监视器很重要
- 项目马上就告一段落了
热门文章
- 塞班s60v3手电筒sisx_塞班s60v3闪光灯手电筒软件可以发给我吗?谢谢!
- 系统学习iOS动画 —— 渐变动画
- Unity-ShaderGraph学习笔记第一步: 如何打开ShaderGraph 制作全息效果Shader
- Git连接oschina管理代码版本
- React页面空白问题
- 风险预测模型_慢性肾脏病孕妇妊娠风险预测模型的构建及验证
- 【北京迅为iMX6ULL】嵌入式学习之Linux系统编程视频教程
- php采集喜马拉雅,喜马拉雅数据 JSSDK API 接入 demo WEB版 标准登录 、免登陆
- c语言设计奥运奖牌管理系统,求一个用C语言编程的奥运奖牌管理系统
- SCA可达性分析基础知识普及