Данни за измерения, които се променят бавно или непредвидимо, се улавят в анализи на бавно променящите се измерения (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 |