Database
 sql >> Baza danych >  >> RDS >> Database

SCD typu 3

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 ""

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kopie zapasowe tylko bazy danych w WHM

  2. Korzyści i bezpieczeństwo w usłudze relacyjnej bazy danych Amazon

  3. Ulepszanie rozwiązania mediany numeracji wierszy

  4. Estymacja liczności dla wielu predykatów

  5. Jak obsługiwać dzielenie przez zero w SQL?