Тип SCD2 и дополнительные флаги.Медленно меняющееся измерение с датами вступления в силу - PullRequest
0 голосов
/ 13 мая 2019

Вот пример целевой таблицы, которую мне нужно построить на 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, но я застрял накак обновить / вставить новые записи для него.

...