GP数据库值拉链表实现

一、概念

  拉链表它是一种维护历史状态,以及最新状态数据的一种表。拉链表也是分区表,有些不变的数据或者是已经达到状态终点的数据就会把它放在分区里面,分区字段一般为开始时间:start_date和结束时间:end_date。一般在该天有效的数据,它的end_date是大于等于该天的日期的。获取某一天全量的数据,可以通过表中的start_date和end_date来做筛选,选出固定某一天的数据。例如我想取截止到20190813的全量有效数据,其where过滤条件就是where start_date<='20190813' and end_date>20190813。

  拉链表的主键一般是是源表加上开始时间(生效时间)

  第一步,先创建源表

create table DATA_SOURCE(
    id varchar(6),
    Name varchar(10),
    address varchar(11),
    start_date date
);
create table DATA_LALIAN(
    id varchar(6),
    Name varchar(10),
    address varchar(11),
    start_date date,
   end_date date );

 第二步,写出拉链表实现框架

  begin --1.全量表与拉链表存在id不相等的用户
      ------1.1 全量表存在而拉链表不存在 - 即为纯新增       ------向临时表1内数据插入纯新增用户 --2.变化,将存在两表都存在的id但其他记录有变化进行处理
      ------2.1 将两表进行内连接接,将拉链表中的该客户记录改为开始时间变为今天,结束时间为无穷大
      ------2.2
将两表进行内连接接,将客户表中的该客户记录改为结束时间为今天,其余记录不变
      ------2.3 将2.1,2.2记录插入临时表2
      --3.开链. 将临时表存在客户记录插入 拉链表中

      --4.删除 拉链表要删除一些记录删除条件是(临时表2也存在相同id)
      --5.删除 拉链表要删除一些用户记录(
全量表不存在而拉链表存在
  end

第三步,实现代码


insert into tmp1
(
id
name
start_date
end_date
)select
s.id,
s.name,
s.start_date as $current_date,
to_date('9999-12-31') as end_date
from DATA_SOURCE S
WHERE NOT_EXISTS(
  SELECT * FROM DATA_LALIAN L,
  S.ID = L.ID
)AND s.start <= $current_date and s.end_date > $current_date

/* */
insert into tmp2(
id,
name,
start_date,
end_date,
)select
S.id,
S.name,
$current_date asstart_date,
to_date('9999-12-31') as end_date
from DATA_SOURCE S INNER JOIN DATA_LALIAN L ON S.ID =L.ID
WHERE EXISTS (
  S.NAME <> L.NAME
)AND S.start_date <= $current_date and S.end_date > $current_date
insert into tmp2(
id,
name,
start_date,
end_date,
)select
L.id,
L.name,
start_date,
$current_date AS end_date
from DATA_SOURCE S INNER JOIN DATA_LALIAN L ON S.ID =L.ID
WHERE EXISTS (
  S.NAME <> L.NAME
)AND S.start_date <= $current_date and S.end_date > $current_date


/* */
INSERT INTP DATA_LALIAN(
ID,
NAME,
START_DATE,
END_DATE
)SELECT
ID,
NAME,
START_DATE,
END_DATE
FROM TMP1


/*      */

DELETE DATA_LANLIAN WHERE ID in (

select ID from TMP2
)

DELETE DATA_LALIAN L  WHERE ID NOT EXISTS(

SELECT * from DATA_SOURCE S,

S.ID  = L.ID)

/*      */

INSERT INTO LALIAN(

ID,

NAME,

START_DATE,

END_DATE,

)SELECT

ID,

NAME,

START_DATE,

END_DATE

FROM TMP1

/*           */

INSERT INTO LALIAN(

ID,

NAME,

START_DATE,

END_DATE,

)SELECT

ID,

NAME,

START_DATE,

END_DATE

FROM TMP2
















      

猜你喜欢

转载自www.cnblogs.com/fanshaoxiang/p/12221902.html