假设有一张居民维表,需要记录居民状态的变更历史,根据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. java模拟post提交

    package javapost; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOE ...

  2. golang闭包

    http://blog.51cto.com/speakingbaicai/1703229 https://www.jianshu.com/p/fa21e6fada70 所谓闭包就是一个函数" ...

  3. ACM-某大牛的建议

    一般要做到50行以内的程序不用调试.100行以内的二分钟内调试成功.acm主要是考算法的,主要时间是花在思考算法上,不是花在写程序与debug上.  下面给个计划你练练:  第一阶段:     练经典 ...

  4. SSH框架里的iHiberBaseDAO类与iHiberDAOImpl写法

    一.iHiberBaseDAO类 package basic; import java.util.*; /** * 基于hibernate技术实现的BaseDAO基类 * @author ZHANGY ...

  5. 【Leetcode】【Easy】Reverse Linked List

    题目: Reverse a singly linked list. 解题: 反转单链表,不再多介绍了. 如果会“先条件->定参数->确定不变式->验证后条件”的思维方法,一定会bug ...

  6. Linux文件系统检查错误

    我们的Linux系统在无法启动时候,通常需要进入单用户模式下进行修改一些配置文件,或调整一些参数方可.但是在进入单用户模式后,我们的/文件系统是只读模式,无法进行修改,那么这个时候我们就需要用到一条命 ...

  7. 设计模式:命令(Command)模式

    设计模式:命令(Command)模式 一.前言 命令也是类,将命令作为一个类来保存,当要使用的时候可以直接拿来使用,比如脚本语言写出的脚本,只需要一个命令就能执行得到我们想要的需要操作很长时间才能得到 ...

  8. January 19 2017 Week 3 Thursday

    What a man needs most is appreciated. 人性最深切的需求就是渴望别人的赞赏. Being appreciated by others is very importa ...

  9. SAP HANA Delivery Unit概念简述

    介绍 在SAP HANA应用开发领域里,我们通常用package来存储modeler views和XS工程等模型.这些包应该被部署到最终的生产服务器上. Delivery Unit是SAP HANA原 ...

  10. MySQL绿色解压缩版安装与配置

    操作步骤: 一.安装MySQL数据库 1.下载MySQL-5.6.17-winx64.zip文件.2.解压到指定目录,本例为D:\mysql-5.6.17-winx64.3.修改配置文件,my-def ...