假设有一张居民维表,需要记录居民状态的变更历史,根据Kimball建模理论,设计居民维表如下:

另外在ODS中有居民信息的每日快照表(每天都记录一份居民的全量信息):O_USERINFO

如何将ODS中的O_USERINFO的每日批次数据加载到居民维表D_RESIDENT_SCD中,需注意两个表必须在同一个数据源中。

在HHDI中新建数据抽取任务,也可采用执行SQL任务,在源表查询语句中写入以下SQL:

SELECT     O.ID RESIDENTID,
     O.NAME,
     O.IDNUMBER,
     O.SEX,
     TO_CHAR(O.BIRTHDAY, 'YYYY/MM/DD') BIRTHDAY,
     AREACODE DIVISIONCODE,
     IFNULL(O.STATUS,-1) STATUS,
     O.CREATETIME,
     O.IMAGEPATH,
     O.CONTACTADDRESS,
     TRUE DIM_FLAG,
     '${HDIBATCHNO}' DIM_STARTTIME,
     '20990101' DIM_ENDTIME
FROM O_USERINFO O
WHERE O.ETLBATCHID = ${HDIBATCHNO}
AND NOT EXISTS (SELECT 1 FROM D_RESIDENT_SCD D WHERE (D.DIM_FLAG=TRUE) AND O.ID = D.RESIDENTID AND IFNULL(O.STATUS,-1) = IFNULL(D.STATUS,-1))
AND NOT EXISTS (SELECT 1 FROM D_RESIDENT_SCD D WHERE ('${HDIBATCHNO}' >=D.DIM_STARTTIME AND '${HDIBATCHNO}' < D.DIM_ENDTIME) AND O.ID = D.RESIDENTID AND IFNULL(O.STATUS,-1) = IFNULL(D.STATUS,-1))

这段SQL的意思是筛选出新增的居民记录以及居民状态发生变化的居民信息,其中WHERE语句的最后一个条件的意思是如果重跑n天之前的历史数据时,将这段时间内的居民状态发生变化的记录(和维表比较)筛选出来。如图:

在目标页签中,在自定义删除语句中,写入以下SQL:

UPDATE PUBLIC.D_RESIDENT_SCD D

SET D.STATUS=(SELECT IFNULL(O.STATUS,-1) FROM O_USERINFO O WHERE O.ETLBATCHID = ${HDIBATCHNO} AND D.RESIDENTID=O.ID AND IFNULL(O.STATUS,-1) <> IFNULL(D.STATUS,-1))
WHERE D.DIM_FLAG=FALSE
AND '${HDIBATCHNO}' >=D.DIM_STARTTIME AND '${HDIBATCHNO}' < D.DIM_ENDTIME
AND EXISTS (SELECT 1 FROM O_USERINFO O WHERE O.ETLBATCHID = ${HDIBATCHNO} AND D.RESIDENTID=O.ID AND IFNULL(O.STATUS,-1) <> IFNULL(D.STATUS,-1))
;

UPDATE PUBLIC.D_RESIDENT_SCD D
SET DIM_FLAG=FALSE,DIM_ENDTIME='${HDIBATCHNO}'
WHERE D.DIM_FLAG=TRUE
AND D.DIM_STARTTIME<='${HDIBATCHNO}'
AND EXISTS (
SELECT 1 FROM O_USERINFO O
WHERE O.ETLBATCHID = ${HDIBATCHNO}
AND D.RESIDENTID=O.ID
AND IFNULL(O.STATUS,-1) <> IFNULL(D.STATUS,-1))
;

这两个SQL的意思是修改已存在的且状态发生变化的居民维度记录的有效标志和有效时间段,第一个UPDATE语句是跑历史数据时需要执行的,第二个语句是用来跑最新数据的,如图:

这样最终在执行任务的时候,先执行两个UPDATE语句,然后再执行INSERT语句将之前SELECT的数据插入到居民维表。

如果是执行SQL任务的话,就是两个UPDATE语句加一个INSERT语句即可。

数据库中该维表写入后的结果如图所示:

HaoheDI(昊合数据整合平台)

是一款基于B/S架构的轻量级ETL工具,开发运维均极为简单,帮您快速搭建ETL平台,广泛支持各种数据库、文本文件、SAP和Hadoop,开发数据转换只需熟悉SQL开发即可,可轻松调度Kettle的转换和作业,并提供图形化的作业流程设计界面,以及可视化的任务作业管理、计划调度、实时监控、消息提醒和日志分析,有效弥补传统ETL工具在调度管理和监控分析等方面的不足,大幅降低您的开发和运维成本,产品还提供数据质量和血缘分析等其它功能,详情可通过官网 http://www.haohedi.com 进行了解和在线体验

如何用SQL语句处理缓慢变化维(渐变维,拉链表)SCD-2?的更多相关文章

  1. 如何用SQL语句查询Excel数据?

    如何用SQL语句查询Excel数据?Q:如何用SQL语句查询Excel数据? A:下列语句可在SQL SERVER中查询Excel工作表中的数据. 2007和2010版本: SELECT*FROMOp ...

  2. 如何用sql语句复制一张表

    如何用sql语句复制一张表 1.复制表结构及数据到新表 CREATE TABLE 新表 SELECT * FROM 旧表 这种方法会将oldtable中所有的内容都拷贝过来,当然我们可以用delete ...

  3. 如何用SQL语句在指定字段前面插入新的字段?

    如何用SQL语句在指定字段前面插入新的字段? 2007-10-17 09:28:00|  分类: 笔记|举报|字号 订阅     create proc addcolumn @tablename va ...

  4. mysql里面如何用sql语句让字符串转换为数字

    sql语句将字符串转换为数字默认去掉单引号中的空格,遇到空格作为字符串截止, SELECT '123 and 1=1' +0 结果为123 MySQL里面如何用sql语句让字符串的‘123’转换为数字 ...

  5. 如何用SQL语句实现Mysql数据库的备份与还原

    以前一直做android客户端的项目,根本没有开发asp.net mvc的开发,现阶段做了一个模块,参数设置,以及数据库的备份与还原.其需求如下: 参数设置 本项参数设置为对自动数据备份进行设置,管理 ...

  6. Sql server中 如何用sql语句创建视图

    1.视图的作用 视图的作用: 第一点:使用视图,可以定制用户数据,聚焦特定的数据. 解释: 在实际过程中,公司有不同角色的工作人员,我们以销售公司为例的话, 采购人员,可以需要一些与其有关的数据,而与 ...

  7. (转)Sql server中 如何用sql语句创建视图

    1.视图的作用 视图的作用: 第一点:使用视图,可以定制用户数据,聚焦特定的数据. 解释:     在实际过程中,公司有不同角色的工作人员,我们以销售公司为例的话,     采购人员,可以需要一些与其 ...

  8. 低效sql语句执行缓慢引起的大量占用服务器的CPU问题处理 (优化心得)

    1> 2> 3> 4> 5>删除不良的执行计划后执行时间仍然有150s,这实在是太慢了,继续查看原sql代码,发现父表的关联条件放在了子查询里,这是应该避免的 调整原sq ...

  9. 关于如何用sql语句查询出连续的一串数字

    在数据库操作中,经常有一些这样的操作:插入诺干条测试数据.查询这个月的登录情况(没有登录的日期不能不存在,要显示数量为0),获取诺干条guid. 这些的基础都是怎么生成连续的一串数字  1 2  3  ...

随机推荐

  1. JavaScript返回上一页

    目前来说有两种方法: window.history.back(); // 返回上一页不刷新 window.location.href = document.referrer; // 返回上一页并刷新

  2. Redis入门实例(Redis+Sprint+maven创建工程)

    一.>创建一个maven工程应用和相关配置:Redis_study,创建工程应用过程略 1.>配置pom.xml:文件内容如下 <project xmlns="http:/ ...

  3. 合并两个数组 以KEY 作为键

    <?php     $a= array(         array(             'ID'=> 2         ) );   $b= array(         arr ...

  4. webpack之react开发前准备

    今天抽出空来,翻了翻webpack之react的书籍,看到刚出的es6语法,貌似是简单了不少,但是兼容性确实不容乐观,如果实在要用那也不是不可以的,首先就跟随我来看下这个插件吧: Babel:这个插件 ...

  5. 重大漏洞!PHP multipart/form-data头部解析远程拒绝服务漏洞

    "有些人看不懂,简单比喻来说吧:目前刚出的任何安全防护都不会拦,网站类专属漏洞 畸形数据包,2KB随机数据包,2M网速打死各种网站,cdn通挂!"PHP multipart/for ...

  6. 在windows平台上构建自己的PHP(php5.3+)

    这是一篇翻译的文章,原文参见:https://wiki.php.net/internals/windows/stepbystepbuild 顺便提一句,wiki.php.net有很多精彩的内容,想深入 ...

  7. 【[TJOI2014]上升子序列】

    这本质上是一个\(dp\) 如果没有"两个上升子序列相同,那么只需要计算一次"这一个性质,那么就很好做了,我们用\(dp[i]\)表示以\(i\)结尾的上升子序列个数,那么就有\( ...

  8. Yii2.0 请求

    1.获取请求参数 $request = Yii::$app->request; $get = $request->get(); // 等价于:$get = $_GET; $id = $re ...

  9. Impossible WHERE noticed after reading const tables

    阿里云反馈的慢SQL,执行计划返回如下:Impossible WHERE noticed after reading const tables sql很简单: SELECT * FROM deposi ...

  10. window下安装composer

    1.什么是composer 一个智能的下载工具.比如说我的项目要安装yii框架,而yii是依赖于其他东西的,仅仅安装yii是不够的,这样会导致我的项目也不能正常运行:怎么办呢,我们可以一个一个手动的将 ...