假设有一张居民维表,需要记录居民状态的变更历史,根据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. ubuntu下root不能复制 abc用户下的软连接文件

    使用root用户去复制,提示权限不足: 那么这个软连接是个什么东西??

  2. C#启动服务

    启动服务的方法有很多种,简单的cmd下dos命名,手动启动,还有C#代码启动. 我们要实现的功能: 判断是否安装 是否启动 启动服务 关闭服务 我封装了有关服务的代码,如下: using System ...

  3. Maven库下载很慢解决办法,利用中央仓库

    以下四个都是可用的: http://mirrors.ibiblio.org/maven2/ http://mvnrepository.com/ http://repository.jboss.org/ ...

  4. 【Leetcode】【Medium】Binary Tree Inorder Traversal

    Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tre ...

  5. TcpListener、TcpClient

    1.TcpClient using System; using System.Text; using System.Net.Sockets; namespace tcpclient { class t ...

  6. dedecms Ajax异步获取文章列表

    dedecms如何通过ajax(异步)动态获取文章列表数据. 第一步添加:服务端(PHP)代码 打开plus目录下面的list.php文件,在12行代码下面添加以下代码: if(isset($_GET ...

  7. RBTree和AVL

      红黑树和AVL的相同:都是平衡二叉树,所以插入删除修改查询都非常高效. 红黑树和AVL的区别: 红黑树:  不是要求绝对平衡,付出的代价是要着色,查询次数可能会多一层,好处是减少旋转次数. AVL ...

  8. Codeforces Round #423 (Div. 2)

    codeforces 423 A. Restaurant Tables [水题] //注意,一个人选座位的顺序,先去单人桌,没有则去空的双人桌,再没有则去有一个人坐着的双人桌.读清题意. #inclu ...

  9. WAS8.5安装和部署

    刚研究WAS8.5的安装部署,写一些注意事项: 1.下载安装软件 安装器:agent.installer.linux.gtk.x86_64_1.7.2000.20140227_0303 WAS: WA ...

  10. IntelliJ IDEA自动补全变量名称和属性名称的快捷键

    自动补全变量名称 : Ctrl + Alt + v 自动补全属性名称 : Ctrl + Alt + f