这是我需要在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,但我仍然坚持如何为其更新/插入新记录。