aa470541419 2022-05-27 14:34 采纳率: 0%
浏览 256
已结题

如何用SQL实现全量切片表转成拉链表

如何用SQL实现全量切片表转成拉链表
必须是写SQL的方式,不能用其他代码实现。
现有全量切片表样数据

切片日期主键编号状态
20211201A01
20211205A01
20220215A02
20220228A03
20220315A01
20220331A01
20220420A01
20220425A02
20220430A01
20211201B01
20211203B01
20220131B02

要一次性转换成拉链数据:要求不能用脚本重复循环跑SQL
转换成拉链表的数据为以下所示,30001231表示长期有效

主键编号开始日期状态结束日期
A202112010120220215
A202202150220220228
A202202280320220315
A202203150120220425
A202204250220220430
A202204300130001231
B202112010120220131
B202201310230001231
  • 写回答

4条回答 默认 最新

  • aa470541419 2022-05-27 16:16
    关注

    我现在主要问题是如何通过单纯的SQL,一次性进行转换。
    若不是一次性,通过循环拉链算法脚本的话,我有样例:

    --把每天跑批日期的切片数据按照拉链的形式插入到临时表中,表示当天新的拉链数据
    INSERT INTO 临时表_当前
    SELECT 
    主键编号
    ,跑批日期
    ,状态
    ,'30001231'
    FROM 切片表
    WHERE 切片日期=跑批日期
    ;
    
    --可以对当天进行重复跑批的操作
    DELETE FROM 目标表
    WHERE 开始日期='变量(跑批日期)'
    AND 结束日期='30001231';
    UPDATE 目标表
    SET 结束日期='30001231'
    WGERE 结束日期='变量(跑批日期)';
    
    --找到与目标表中生效的数据不同的数据
    INSERT INTO 临时表_插入
    SELECT 
    主键编号
    ,开始日期
    ,状态
    .结束日期
    FROM 临时表_当前
    WHERE NOT EXISTS
    (
    SELECT 1
    FROM  目标表 
    WHERE 临时表_当前.主键编号=目标表.主键编号
    AND 临时表_当前.状态=目标表.状态
    AND 目标表.结束日期=30001231’
    );
    
    --更新目标表中的数据,对更新的数据进行关链
    UPDATE 目标表
    SET END_DT='跑批日期'
    WHERE END_DT='30001231'
    AND EXISTS
    (SELECT 1
    FROM 临时表_插入
    WHERE 目标表.主键编号=临时表_插入.主键编号
    );
    --新增的数据插入目标表中
    INSERT INTO 目标表
    SELECT 
    主键编号
    ,’跑批日期‘
    ,状态
    ,'30001231'
    FROM 临时表_插入;
    

    然后将以上的SQL,封装下,按照日期每天一次顺序跑批,也能完成切片转换成拉链的算法。
    但是此方法碰到要处理10年的数据话,就要跑10年的每一日的批次,有点慢。
    因此有大佬能一次性写个SQL,直接完成切片转换成拉链的么?

    评论

报告相同问题?

问题事件

  • 系统已结题 6月4日
  • 创建了问题 5月27日

悬赏问题

  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况
  • ¥15 画两个图 python或R