Вот пример целевой таблицы, которую мне нужно построить на 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, в которой соответствующие записи из ленты обновлены до целевой таблицы Historical.И несоответствующие (новые) записи, вставленные в Историческую таблицу.Я застрял в том, чтобы назначить sold_flg = True и поддерживать его при ежедневных обновлениях / вставках.
В строке перед последней в приведенной выше таблице sold_flg отображается как True, а active_flg - как True только для визуального отображения.Если этот id / vin отсутствовал в ленте 1/10, 1/11, Sold_flg будет True.Предположим, что в следующий раз тот же идентификатор / vin появится в 1/12, как и в последней показанной записи, поэтому, когда через 3 дня она появится, необходимо обновить предыдущую запись, чтобы закрыть end_dt и вставить новую.
Требование дляSold_flg: Sold = True, если не появилось в ленте на следующий день.И если id / vin появился в ленте в течение <= 30 дней, для автомобиля, который ПРОДАН = ИСТИНА, измените его на False.Вставьте новую запись для того же идентификатора / вин с новым start_dt, end_dt. </p>
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
;
Итак, начальный набор sold_flg установлен в false, но я застрял накак обновить / вставить новые записи для него.