Dane wymiarowe, które zmieniają się powoli lub nieprzewidywalnie, są rejestrowane w analizach wolno zmieniających się wymiarów (SCD). W środowisku hurtowni danych tabela wymiarów ma klucz podstawowy, który jednoznacznie identyfikuje każdy rekord i inne informacje znane jako dane wymiarowe.
Wszystkie metody aktualizacji dla różnych typów SCD można wykonać za pomocą programu SortCL w IRI CoSort. W IRI Voracity dostępny jest kreator, który pomaga w tworzeniu skryptów zadań SCD używanych podczas uruchamiania programu SortCL. Większość odmian używa pełnego sprzężenia zewnętrznego w celu dopasowania rekordów z oryginalnego głównego źródła danych do rekordów w zaktualizowanym źródle na podstawie zrównania klucza z każdego z nich. Rekordy z dopasowaniami muszą zostać zaktualizowane w masterze. Rekordy w źródle aktualizacji, które nie pasują do siebie, muszą zostać dodane do wzorca.
Oto przegląd, jak zaktualizować plik wymiarowy za pomocą SCD Typ 3, gdzie utrzymuję koszty produktu. Aktualizacja odbywa się poprzez dołączenie w odniesieniu do pola Kod produktu .
SCD typu 3
W modelu typu 3 dane bieżące i dane historyczne są przechowywane w tym samym rekordzie. Jedną z głównych kwestii, na które należy zdecydować, jest to, ile historii należy przechowywać. W naszym przykładzie zachowam koszt przez trzy daty rozpoczęcia. Data końcowa to data, w której koszt w rekordzie przestaje obowiązywać. Jeśli koszt nadal obowiązuje, EndDate1 pole zostanie ustawione na 99991231. Ma to na celu uniknięcie pustej wartości w tym polu. Oto wartości zawarte w początkowym głównym źródle (master3.dat):
Kod produktu | Koszt1 | DataRozpoczęcia1 | EndDate1 | Koszt2 | DataRozpoczęcia2 | EndDate2 | Koszt3 | Data rozpoczęcia3 | EndDate3 |
---|---|---|---|---|---|---|---|---|---|
C123 | 125,50 | 20110228 | 99991231 | ||||||
F112 | 2365,00 | 20120101 | 99991231 | ||||||
G101 | 19,25 | 20110930 | 99991231 | 21,25 | 20110501 | 20110930 | |||
J245 | 450,50 | 20110430 | 99991231 | 425,25 | 20101001 | 20110430 | 385,25 | 20100215 | 20101001 |
S022 | 98,75 | 20110515 | 99991231 |
Wszystkie rekordy aktualizacji mają tę samą datę rozpoczęcia. Źródło update.dat zawiera następujące wartości pól dla rekordów:
Kod produktu | Koszt | Data rozpoczęcia |
---|---|---|
F112 | 2425,00 | 20120701 |
J245 | 550,50 | 20120701 |
M447 | 101,75 | 20120701 |
S022 | 101,75 | 20120701 |
Poniżej znajdują się zaktualizowane dane. W przypadku każdego zaktualizowanego rekordu każdy koszt, data rozpoczęcia i data zakończenia są przesuwane w prawo o jeden zestaw. W starej bieżącej grupie rekordu data końcowa jest zmieniana na datę początkową nowego zaktualizowanego bieżącego zestawu. Wszelkie wartości dla starego trzeciego zestawu są odrzucane.
Kod produktu | Koszt1 | DataRozpoczęcia1 | EndDate1 | Koszt2 | DataRozpoczęcia2 | EndDate2 | Koszt3 | Data rozpoczęcia3 | EndDate3 |
---|---|---|---|---|---|---|---|---|---|
C123 | 125,50 | 20110228 | 9991231 | ||||||
F112 | 2425,00 | 20120701 | 9991231 | 2365,00 | 20120101 | 20120701 | |||
G101 | 19,25 | 20110930 | 9991231 | 21,25 | 20110501 | 20110930 | |||
J245 | 550,50 | 20120701 | 9991231 | 450,50 | 20110430 | 20120701 | 425,25 | 20101001 | 20110430 |
M447 | 101,75 | 20120701 | 9991231 | ||||||
S022 | 101,75 | 20120701 | 9991231 | 98,75 | 20110515 | 20120701 |
W IRI Workbench dostępny jest kreator Voracity, który pomaga w tworzeniu skryptów do aktualizacji plików i tabel Dimensional. Ten kreator znajduje się w menu rozwijanym Wolność na pasku nawigacyjnym. Najpierw wybierasz typ SCD. Następnie zostanie wyświetlone okno, w którym wybierasz pliki używane do przetwarzania aktualizacji.
W górnej tabeli na następnym ekranie określasz, w jaki sposób aktualizowane dane są mapowane do wzorca. W środkowej grupie na ekranie wybierz pola, które podają wartości stanu aktualizowanych rekordów.
W menu rozwijanych w sekcji Bieżące i Zestawy pól historycznych , pierwszy zdefiniowany zestaw zawiera nazwy pól dla bieżących wartości. Pole wartości jest aktualizowaną wartością wymiaru. Pole początkowe to pole, które określa, kiedy Pole wartości stał się aktywny i End Field określa, kiedy traci ważność. Następnie zdefiniuj tyle zestawów, ile potrzebujesz dla liczby przechowywanych wartości historycznych.
Oto skrypt zadania, który zaktualizuje plik główny:
/INFILE=master3.dat /PROCESS=DELIMITED /ALIAS=master3 /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",") /FIELD=(COST1, TYPE=NUMERIC, POSITION=2, SEPARATOR=",") /FIELD=(STARTDATE1, TYPE=ASCII, POSITION=3, SEPARATOR=",") /FIELD=(ENDDATE1, TYPE=ASCII, POSITION=4, SEPARATOR=",") /FIELD=(COST2, TYPE=NUMERIC, POSITION=5, SEPARATOR=",") /FIELD=(STARTDATE2, TYPE=ASCII, POSITION=6, SEPARATOR=",") /FIELD=(ENDDATE2, TYPE=ASCII, POSITION=7, SEPARATOR=",") /FIELD=(COST3, TYPE=NUMERIC, POSITION=8, SEPARATOR=",") /FIELD=(STARTDATE3, TYPE=ASCII, POSITION=9, SEPARATOR=",") /FIELD=(ENDATE3, TYPE=ASCII, POSITION=10, SEPARATOR=",") /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 master3 update WHERE MASTER3.PRODUCTCODE == UPDATE.PRODUCTCODE /OUTFILE=master3.dat # Include only records that are to be updated /PROCESS=DELIMITED /FIELD=(UPDATE.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",") /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",") /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",") /FIELD=(ENDDATE1_NEW="99991231", TYPE=ASCII, POSITION=4, SEPARATOR=",") /FIELD=(MASTER3.COST1, TYPE=NUMERIC, POSITION=5, SEPARATOR=",") /FIELD=(MASTER3.STARTDATE1, TYPE=ASCII, POSITION=6, SEPARATOR=",") /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=7, SEPARATOR=",") /FIELD=(MASTER3.COST3, TYPE=NUMERIC, POSITION=8, SEPARATOR=",") /FIELD=(MASTER3.STARTDATE3, TYPE=ASCII, POSITION=9, SEPARATOR=",") /FIELD=(MASTER3.ENDATE3, TYPE=ASCII, POSITION=10, SEPARATOR=",") /INCLUDE WHERE MASTER3.PRODUCTCODE == UPDATE.PRODUCTCODE /OUTFILE=master3.dat # Include only records that are not to be updated /PROCESS=DELIMITED /FIELD=(MASTER3.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",") /FIELD=(MASTER3.COST1, TYPE=NUMERIC, POSITION=2, SEPARATOR=",") /FIELD=(MASTER3.STARTDATE1, TYPE=ASCII, POSITION=3, SEPARATOR=",") /FIELD=(MASTER3.ENDDATE1, TYPE=ASCII, POSITION=4, SEPARATOR=",") /FIELD=(MASTER3.COST2, TYPE=NUMERIC, POSITION=5, SEPARATOR=",") /FIELD=(MASTER3.STARTDATE2, TYPE=ASCII, POSITION=6, SEPARATOR=",") /FIELD=(MASTER3.ENDDATE2, TYPE=ASCII, POSITION=7, SEPARATOR=",") /FIELD=(MASTER3.COST3, TYPE=NUMERIC, POSITION=8, SEPARATOR=",") /FIELD=(MASTER3.STARTDATE3, TYPE=ASCII, POSITION=9, SEPARATOR=",") /FIELD=(MASTER3.ENDATE3, TYPE=ASCII, POSITION=10, SEPARATOR=",") /OMIT WHERE MASTER3.PRODUCTCODE == UPDATE.PRODUCTCODE /OMIT WHERE MASTER3.PRODUCTCODE EQ "" /OUTFILE=C:/IRI/CoSort95/workbench.orig/workspace/SCD/SCD3/master3.dat # Add new records /PROCESS=DELIMITED /FIELD=(UPDATE.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",") /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",") /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",") /FIELD=(ENDDATE1_NEW="99991231", TYPE=ASCII, POSITION=4, SEPARATOR=",") /INCLUDE WHERE MASTER3.PRODUCTCODE EQ "" AND UPDATE.PRODUCTCODE NE ""