怎么制作拉链表?

问答 doublek ⋅ 于 2021-06-02 11:25:15 ⋅ 最后回复由 犀牛 2021-06-02 17:07:02 ⋅ 1229 阅读

我有一张记录客户初始额度的表。 和一张记录客户额度变化的流水表,这张表只有额度变化了才有记录。怎么用这两张表做拉链表呢 并没有每天的全量数据

成为第一个点赞的人吧 :bowtie:
回复数量: 4
  • 犀牛
    2021-06-02 11:49:48

    首先拉链表必要要有主键,通过主键进行关联,对比增量数据和存量数据是否一致。
    区别于全量拉链,你的需求可以换个角度去实现:

    1. 首先拿到增量数据
    2. 使用增量数据的主键和存量的表通过主键关联,关联上的数据存到一张临时表(tmp1)里,没关联上的存在另一张临时表(tmp2)里,我们认为tmp1表这部分是发生变化了的,tmp2表是没有发生变化的
    3. 然后使用拉链表的逻辑处理tmp1表的starttime、endtime、mark、以及变化的字段,记得发生变化了的历史数据闭环,最新状态的数据新增一条开链数据,所以这步应该再产生两张临时表,一张是发生变化后的数据或者新增记录的表,另一张应该是历史状态的闭链表(即endtime修改为跑批日期)
    4. 然后将第三步处理的数据和tmp2表数据合并,回插回全量拉链表(清空后再插入)

      第三步逻辑可以参考我们部落的拉链表文章http://www.hainiubl.com/topics/75543,step2和step3

  • doublek
    2021-06-02 11:56:00

    @犀牛 感谢 我尝试实现一下

  • doublek
    2021-06-02 14:54:01

    @犀牛
    --变化数据
    SELECT
    cod_cust_id
    ,amt_credit_new
    ,dat_create
    FROM (
    SELECT
    cod_cust_id
    ,amt_credit_new
    ,dat_create
    ,ROW_NUMBER()
    OVER (PARTITION BY cod_cust_id,SUBSTRING(dat_create,1,10) ORDER BY dat_create DESC ) AS rn--如果客户在同一天多次申请通过,则取日期最大那次
    FROM thai_dw.snap_cmisdb_cmis_card_limit_change
    WHERE flg_status_apply =8
    )
    WHERE rn =1
    ;

    --没有发生变化的数据
    SELECT
    p2.cod_cust_id
    ,p2.amt_credit
    ,p2.dat_create
    FROM (
    SELECT
    cod_cust_id
    ,amt_credit_new
    FROM (
    SELECT
    cod_cust_id
    ,amt_credit_new
    ,dat_create
    ,ROW_NUMBER()
    OVER (PARTITION BY cod_cust_id,SUBSTRING(dat_create,1,10) ORDER BY dat_create DESC ) AS rn--如果客户在同一天多次申请通过,则取日期最大那次
    FROM thai_dw.snap_cmisdb_cmis_card_limit_change
    WHERE flg_status_apply =8
    )
    WHERE rn =1
    ) p1
    RIGHT JOIN (
    SELECT
    cod_cust_id
    ,amt_credit
    ,dat_create
    FROM thai_dw.snap_cmisdb_cmis_card_apply
    WHERE flg_status_apply =8
    ) p2
    ON p1.cod_cust_id = p2.cod_cust_id
    WHERE p1.cod_cust_id IS NULL
    ;

    我以数据创建时间dat_create作为starttime,什么为endtime呢?没有发生变化的数据mark都是i,发生变化的数据mark都是u可以吗?因为不会有数据被删除

  • 犀牛
    2021-06-02 17:07:02

    可以修改mark,再加一个case逻辑。在我们的样例里i是包含了iu两种情况的。
    如果发生了变化,针对闭环的那条数据的endtime就是batchdate;
    如果发生了变化,针对最新那条数据的endtime就是maxdate,比如29991231或者30000101;

暂无评论~~
  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,可用Emoji的自动补全, 在输入的时候只需要 ":" 就可以自动提示了 :metal: :point_right: 表情列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif,教程
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
Ctrl+Enter