Database
 sql >> база данни >  >> RDS >> Database

SCD тип 6

Данни за измерения, които се променят бавно или непредвидимо, се улавят в анализи на бавно променящите се измерения (SCD). В среда на хранилище за данни таблицата с измерения има първичен ключ, който уникално идентифицира всеки запис и други части от информация, които са известни като данни за измерения.

Всички методи за актуализиране за различните типове SCD могат да се осъществят с помощта на програмата SortCL в IRI CoSort. В IRI Voracity има съветник, който да помага при създаването на скриптове за задания SCD, използвани при изпълнение на програмата SortCL. Повечето варианти използват пълно външно свързване, за да съпоставят записи от оригиналния източник на данни със записи в актуализирания източник въз основа на приравняване на ключ от всеки. Записите в източника на актуализация, които нямат съвпадение, трябва да бъдат добавени към главния.

Ето преглед на това как да актуализирам файл с размери или таблица с помощта на SCD тип 6, където поддържам разходите за продукти. Актуализацията се извършва чрез присъединяване по отношение на полето ProductCode .

Тип 6 SCD

Тип 6 е хибрид, който е комбинация от Тип 1, Тип 2 и Тип 3. Нарича се Тип 6, защото 1+2+3=6. Всеки запис ще има следните полета:

  • Код на продукта :  Това е полето за ключов идентификатор.
  • Цена :Текуща цена на продукта.
  • Историческа цена :Разходи, които са влезли в сила на началната дата за този запис.
  • Начална дата :Дата, на която HistoricalCost влезе в сила.
  • Крайна дата :Дата, на която HistoricalCost за записа вече не е текущата CurrentCost. Ако HistoricalCost все още е текущата цена, тогава крайната дата е 99991231.
  • Текущи :Y ако цената е все още актуална, N ако не е

Засега нека просто да разгледаме записите за ProductCode J245. Нека започнем при най-ранния HistoricalCost беше текущата цена. Историческата цена е същата като цената. След това има един запис за ProductCode J245 и той има стойностите, показани по-долу:

Код на продукта Разходи Историческа цена Начална дата Крайна дата Текуща
J245 385,25 385,25 20100215 99991231 Y

Когато трябва да бъде внедрена нова цена, стойностите в записа за актуализиране се използват за добавяне на нов текущ запис. Текуща цена във всички записи с продуктов код J245 ще бъде променен на Цена стойност от записа за актуализиране, докато HistoricalCost остава същото за съществуващите записи. Освен това Крайна дата за стария текущ запис се променя на Начална дата за новия текущ рекорд. В записите с Код на продукта J245, Текуща цена полето в актуализирания главен файл вече има следните стойности:

Код на продукта Разходи Историческа цена Начална дата Крайна дата Текуща
J245 425,25 425,25 20101001 99991231 Y
J245 425,25 385,25 20100215 20101001 N

Сега ще актуализираме със следващата нова цена и ще получим следните стойности за J245 записите:

Код на продукта Разходи Историческа цена Начална дата Крайна дата Текуща
J245 450,50 450,50 20110430 99991231 Y
J245 450,50 425,25 20101001 20110430 N
J245 450,50 385,25 20100215 20101001 N

Окончателната актуализация създава записи, които имат следните стойности:

Код на продукта Разходи Историческа цена Начална дата Крайна дата Текуща
J245 550,50 550,50 20120701 99991231 Y
J245 550,50 450,50 20110430 20120701 N
J245 550,50 425,25 20101001 20110430 N
J245 550,50 385,25 20100215 20101001 N

Ето стойностите в главния файл преди актуализирането:

Код на продукта Разходи Историческа цена Начална дата Крайна дата Текуща
C123 125,50 125,50 20110228 99991231 Y
F112 2365,00 2365,00 20120101 99991231 Y
G101 19,25 19,25 20110930 99991231 Y
G101 19,25 21,25 20110501 20110930 N
J245 450,50 450,50 20110430 99991231 Y
J245 450,50 425,25 20101001 20110430 N
J245 450,50 385,25 20100215 20101001 N
S022 98,75 98,75 20110515 99991231 Y

Всички данни за актуализиране ще имат една и съща начална дата . Източникът update.dat съдържа следните стойности:

Код на продукта Разходи Начална дата
F112 2425,00 20120701
J245 550,50 20120701
M447 101,75 20120701
S022 101,75 20120701

В IRI Workbench има съветник за Voracity, който помага при създаването на скриптове за актуализиране на размерни файлове и таблици. Този съветник се намира в падащото меню Прожорливост в лентата за навигация. Първо избирате типа SCD. След това се показва прозорецът, в който избирате източниците, които се използват за обработка на актуализацията. За Тип 6 целта обикновено е оригиналният главен файл или таблица.

Със следващия екран вие определяте как се картографират данните за актуализиране и как се задават други стойности на полета или колони. актуализация.Цена полето ще се съпостави с master6.CurrentCost и update.StartDate полето ще се съпостави с master6.StartDate . Полето на флага е полето, което се използва, за да се определи дали записът съдържа най-новите стойности на полето. В този случай това поле е master6.current . Ако това е най-актуалният запис, тогава CurrentCost полето и HistoryCost полето ще има същите стойности. Положителна стойност на флага е стойността в master6.Current което определя, че стойностите на полето са най-новите стойности за ProductCode . Когато случаят е такъв, стойността е „Y“ в нашия пример и Flag Negative Value е „N“. Крайно поле съдържа името на полето, което съдържа стойността, използвана за определяне кога цената за записа вече не е ефективна и Master.EndDate притежава тази стойност. Крайна стойност се използва като стойност за Крайно поле когато записът е актуален.

Следващият екран е за дефиниране на присъединяването, извършено с главния източник и източниците за актуализиране. Трябва да имате предвид, че и двата източника трябва да бъдат подредени по отношение на ProductCode . Ако не са, тогава трябва да изберете NOT_SORTED в падащото меню за Опция за сортиране под източника на данни, който трябва да бъде сортиран.

Ето първия скрипт за работа:

/INFILE=master6.dat
    /PROCESS=DELIMITED
    /ALIAS=master6
    /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"')
    /FIELD=(CURRENTCOST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"')
    /FIELD=(HISTORICALCOST, TYPE=NUMERIC, POSITION=3, SEPARATOR=",", FRAME='\"')
    /FIELD=(STARTDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"')
    /FIELD=(ENDDATE, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"')
    /FIELD=(CURRENT, TYPE=ASCII, POSITION=6, SEPARATOR=",", FRAME='\"')
/INFILE=update.dat
    /PROCESS=DELIMITED
    /ALIAS=update
    /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"')
    /FIELD=(COST, TYPE=ASCII, POSITION=2, SEPARATOR=",", FRAME='\"')
    /FIELD=(STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"')

/JOIN FULL_OUTER NOT_SORTED master6 update WHERE MASTER6.PRODUCTCODE == UPDATE.PRODUCTCODE

/OUTFILE=master6.dat
# Make changes to records that have the same ProductCode
# as records in the update file 
    /PROCESS=DELIMITED
    /FIELD=(MASTER6.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"')
    /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"')
    /FIELD=(MASTER6.HISTORICALCOST, TYPE=NUMERIC, POSITION=3, SEPARATOR=",", FRAME='\"')
    /FIELD=(MASTER6.STARTDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"')
    /FIELD=(ENDDATE_NEW, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"', IF MASTER6.CURRENT EQ "Y" THEN UPDATE.STARTDATE ELSE MASTER6.ENDDATE)
    /FIELD=(CURRENT_NEW="N", TYPE=ASCII, POSITION=6, SEPARATOR=",", FRAME='\"')
    /INCLUDE WHERE MASTER6.PRODUCTCODE == UPDATE.PRODUCTCODE

/OUTFILE=master6.dat
# Keep the records that have no updates 
    /PROCESS=DELIMITED
    /FIELD=(MASTER6.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"')
    /FIELD=(MASTER6.CURRENTCOST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"')
    /FIELD=(MASTER6.HISTORICALCOST, TYPE=NUMERIC, POSITION=3, SEPARATOR=",", FRAME='\"')
    /FIELD=(MASTER6.STARTDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"')
    /FIELD=(MASTER6.ENDDATE, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"')
    /FIELD=(MASTER6.CURRENT, TYPE=ASCII, POSITION=6, SEPARATOR=",", FRAME='\"')
    /OMIT WHERE MASTER6.PRODUCTCODE == UPDATE.PRODUCTCODE
    /OMIT WHERE MASTER6.PRODUCTCODE EQ ""

/OUTFILE=master6.dat
# Add the records with new product codes
    /PROCESS=DELIMITED
    /FIELD=(UPDATE.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"')
    /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"')
    /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=3, SEPARATOR=",", FRAME='\"')
    /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"')
    /FIELD=(ENDDATE_NEW="99991231", TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"')
    /FIELD=(CURRENT_NEW="Y", TYPE=ASCII, POSITION=6, SEPARATOR=",", FRAME='\"')
    /OMIT WHERE UPDATE.PRODUCTCODE EQ ""
    /INCLUDE WHERE UPDATE.PRODUCTCODE

За преглед,

  • Стойността за CurrentCost ще бъде еднакъв за всички записи, които имат общ Код на продукта
  • Начална дата е датата, на която HistoricalCost влезе в сила
  • За най-актуалния запис на Код на продукта,
    • стойностите за CurrentCost и Историческа цена са еднакви
    •  Крайна дата е 99991231
    • Стойността в Текуща е Y
  • За записите, които не са текущият запис
    • Крайна дата е датата на следващата по-скорошна Цена влезе в сила
    • Полето Текущи има N за стойността

Новият главен файл няма да бъде сортиран, защото новите текущи основни записи бяха добавени в долната част на главния файл, който ще има следните стойности:

Код на продукта Разходи Историческа цена Начална дата Крайна дата Текуща
C123 125,50 125,50 20110228 99991231 Y
F112 2425,00 2365,00 20120101 20120701 N
G101 19,25 19,25 20110930 99991231 Y
G101 19,25 21,25 20110501 20110930 N
J245 550,50 450,50 20110430 20120701 N
J245 550,50 425,25 20101001 20110430 N
J245 550,50 385,25 20100215 20101001 N
S022 101,75 98,75 20110515 20120701 N
F112 2425,00 2425,00 20120701 99991231 Y
J245 550,50 550,50 20120701 99991231 Y
M447 139,25 139,25 20120701 99991231 Y
S022 101,75 101,75 20120701 99991231 Y

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какво ми трябва, за да стартирам SQL?

  2. SQL по-малко или равно на (=) оператор за начинаещи

  3. Преглед на поточно репликация за TimescaleDB

  4. Как да анализирате низове като професионалист с помощта на функцията SQL SUBSTRING()?

  5. Как да махнете таблици и колони с SQL