SCD2类型和其他标志。生效日期的尺寸变化缓慢

时间:2019-05-13 06:33:39

标签: sql amazon-redshift scd2

这是我需要在Redshift上构建的目标表的示例。此目标表是一个历史表,其中包含所有记录及其状态。 我正在接收包含新的和更新的记录的每日文件(提要)。

id  vin price   mileage change_dt   start_dt    end_dt  sold_flg active_flg

12010   2HGFB2F59DH573971 13900 34325   1/1/17  1/1/17  1/2/17  FALSE   FALSE   
12010   2HGFB2F59DH573971 13500 34325   1/3/17  1/3/17  1/6/17  FALSE   FALSE   
12010   2HGFB2F59DH573971 13500 34326   1/6/17  1/6/17  1/9/19  TRUE    TRUE     
12010   2HGFB2F59DH573971 13400 34326   1/12/17 1/12/17 12/31/99    FALSE   TRUE

因此,我创建了典型的SCD2类型表,其中来自Feed的匹配记录已更新为目标历史表。并将非匹配(新)记录插入“历史记录”表中。 我遇到的困难是,分配sold_flg = True,并在每日更新/插入中维护它。

为了直观起见,上表中最后一行之前的第一行将sold_flg显示为True,将active_flg显示为True。 如果此ID / VIN在1 / 10、1 / 11的供稿中不存在,则Sold_flg为True。 假设下一次与显示的最后一条记录相同的id / vin出现在1/12上,那么当它出现3天后,需要更新以前的记录以关闭end_dt并重新插入。

Sold_flg的要求是: 已售=如果第二天未出现在Feed中,则为True。 如果id / vin在<= 30天内出现在Feed中,则对于SOLD = TRUE的汽车,请将其更新为False。使用新的start_dt,end_dt插入具有相同id / vin的新记录。

我现在拥有的SQL:

UPDATE target_hist_table
   SET
   end_dt = src.feed_date,
   active_flg = False,
  FROM feed                  src
  JOIN target_hist_table     trg
    ON src.id = trg.id
    and src.vin = trg.vin
   AND trg.vin_last_dt = '3999-12-31'

 WHERE  src.feed_date  >  trg.start_dt
       /* And fields has changed */
   AND (src.price !=  trg.price
    OR  src.mileage !=  trg.mileage)
    ;

INSERT INTO target_hist_table
      (
      id
      ,vin
      ,price
      ,change_dt
      ,mileage
      ,start_dt
      ,end_dt
      ,sold_flg
      ,active_flg
      )
SELECT
      src.id
      ,src.vin
      ,src.price
      ,src.feed_date as change_dt
      ,src.mileage
      ,src.cpo_flag
      ,src.feed_date as start_dt
      ,'3999-12-31' as end_dt
      ,False  as sold_flg
      ,True as active_flg
  FROM feed                                     src
  LEFT JOIN target_hist_table trg
         ON src.id = trg.id
         and src.vin = trg.vin
/* Insert if record does not yet exist in trg */
 WHERE trg.id IS NULL and trg.vin is NULL
/* Or the previous record ends **in this feed **.  */
    OR trg.end_dt = src.feed_date
        ;

因此,这里存在初始值设置为false的sold_flg,但我仍然坚持如何为其更新/插入新记录。

0 个答案:

没有答案