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

Typ SCD 6

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 źródła danych do rekordów w zaktualizowanym źródle na podstawie zrównania klucza z każdego z nich. Rekordy w źródle aktualizacji, które nie pasują do siebie, muszą zostać dodane do wzorca.

Oto przegląd, jak zaktualizować plik wymiarowy lub tabelę za pomocą SCD Typ 6, gdzie utrzymuję koszty produktu. Aktualizacja odbywa się poprzez dołączenie w odniesieniu do pola Kod produktu .

Wpisz 6 SCD

Typ 6 to hybryda będąca kombinacją Typu 1, Typu 2 i Typu 3. Nazywa się Typ 6, ponieważ 1+2+3=6. Każdy rekord będzie miał następujące pola:

  • Kod produktu :  To jest pole klucza identyfikatora.
  • Koszt :Aktualny koszt produktu.
  • Koszt historyczny :Koszt, który wszedł w życie w dacie rozpoczęcia dla tego rekordu.
  • Data rozpoczęcia :Data wejścia w życie Kosztu Historycznego.
  • Data zakończenia :Data, w której koszt historyczny rekordu nie był już bieżącym kosztem bieżącym. Jeśli Koszt Historyczny jest nadal kosztem bieżącym, data zakończenia to 99991231.
  • Bieżące :Y, jeśli Koszt jest nadal aktualny, N, jeśli nie jest

Na razie spójrzmy tylko na rekordy dla Kod produktu J245. Zacznijmy od najwcześniejszego kosztu historycznego był obecny koszt. Koszt historyczny jest taki sam jak koszt. Jest wtedy jeden rekord dla kodu produktu J245 i ma on wartości pokazane poniżej:

Kod produktu Koszt Koszt historyczny Data rozpoczęcia Data zakończenia Bieżący
J245 385,25 385,25 20100215 99991231 T

Gdy konieczne jest zaimplementowanie nowego kosztu, wartości w rekordzie aktualizacji są używane do dodania nowego rekordu bieżącego. Aktualny koszt we wszystkich rekordach z kodem produktu J245 zostanie zmieniony na Koszt wartość z rekordu aktualizacji, podczas gdy HistoricalCost pozostaje taka sama dla istniejących rekordów. Ponadto EndDate dla starego aktualnego rekordu jest zmieniana na Data rozpoczęcia dla nowego obecnego rekordu. W rekordach z Kodem Produktu J245, bieżący koszt pole w zaktualizowanym pliku głównym ma teraz następujące wartości:

Kod produktu Koszt Koszt historyczny Data rozpoczęcia Data zakończenia Bieżący
J245 425,25 425,25 20101001 99991231 T
J245 425,25 385,25 20100215 20101001 N

Teraz zaktualizujemy kolejny nowy koszt i otrzymamy następujące wartości dla rekordów J245:

Kod produktu Koszt Koszt historyczny Data rozpoczęcia Data zakończenia Bieżący
J245 450,50 450,50 20110430 99991231 T
J245 450,50 425,25 20101001 20110430 N
J245 450,50 385,25 20100215 20101001 N

Ostatnia aktualizacja tworzy rekordy, które mają następujące wartości:

Kod produktu Koszt Koszt historyczny Data rozpoczęcia Data zakończenia Bieżący
J245 550,50 550,50 20120701 99991231 T
J245 550,50 450,50 20110430 20120701 N
J245 550,50 425,25 20101001 20110430 N
J245 550,50 385,25 20100215 20101001 N

Oto wartości w pliku głównym przed aktualizacją:

Kod produktu Koszt Koszt historyczny Data rozpoczęcia Data zakończenia Bieżący
C123 125,50 125,50 20110228 99991231 T
F112 2365,00 2365,00 20120101 99991231 T
G101 19,25 19,25 20110930 99991231 T
G101 19,25 21,25 20110501 20110930 N
J245 450,50 450,50 20110430 99991231 T
J245 450,50 425,25 20101001 20110430 N
J245 450,50 385,25 20100215 20101001 N
S022 98,75 98,75 20110515 99991231 T

Wszystkie dane aktualizacji będą miały tę samą Data rozpoczęcia . Źródło update.dat zawiera następujące wartości:

Kod produktu Koszt Data rozpoczęcia
F112 2425,00 20120701
J245 550,50 20120701
M447 101,75 20120701
S022 101,75 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 należy wybrać źródła wykorzystywane do przetwarzania aktualizacji. W przypadku typu 6 celem jest zwykle oryginalny plik główny lub tabela.

Na następnym ekranie określasz, w jaki sposób dane aktualizacji są mapowane i jak ustawiane są inne wartości pól lub kolumn. aktualizacja.Koszt pole zostanie odwzorowane na master6.CurrentCost i aktualizacja.DataRozpoczęcia pole zostanie zmapowane na master6.StartDate . Pole flagi to pole używane do określenia, czy rekord zawiera najnowsze wartości pól. W tym przypadku to pole to master6.current . Jeśli jest to najbardziej aktualny rekord, to CurrentCost pole i HistoryCost pole będzie miało te same wartości. Zgłoś pozytywną wartość to wartość w master6.Current który określa, że ​​wartości pól są najnowszymi wartościami dla kodu produktu . W takim przypadku wartością w naszym przykładzie jest „Y”, a Oznacz wartość ujemną to „N”. Pole końcowe zawiera nazwę pola, które przechowuje wartość używaną do określenia, kiedy Koszt dla rekordu nie jest już efektywny i Master.EndDate utrzymuje tę wartość. Wartość końcowa jest używany jako wartość dla Pole końcowe kiedy rekord jest aktualny.

Kolejny ekran służy do zdefiniowania złączenia wykonanego ze źródłami głównymi i aktualizacyjnymi. Należy pamiętać, że oba źródła muszą być uporządkowane w odniesieniu do kodu produktu . Jeśli tak nie jest, musisz wybrać opcję NIESPORZĄDZONE w menu Opcja sortowania pod źródłem danych, które należy posortować.

Oto pierwszy skrypt pracy:

/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

Aby przejrzeć,

  • Wartość CurrentCost będą takie same dla wszystkich rekordów, które mają wspólny kod produktu
  • Data rozpoczęcia to data, kiedy HistoricalCost stał się skuteczny
  • Najbardziej aktualny zapis Kodu produktu
    • wartości CurrentCost i Koszt historyczny są takie same
    • Data zakończenia to 99991231
    • Wartość w Bieżącym jest Y
  • Dla rekordów, które nie są bieżącym rekordem
    • Data zakończenia to data następnego, nowszego kosztu stał się skuteczny
    • Pole Bieżące ma N jako wartość

Nowy plik główny nie zostanie posortowany, ponieważ nowe aktualne rekordy główne zostały dodane na dole pliku głównego, które będą miały następujące wartości:

Kod produktu Koszt Koszt historyczny Data rozpoczęcia Data zakończenia Bieżący
C123 125,50 125,50 20110228 99991231 T
F112 2425,00 2365,00 20120101 20120701 N
G101 19,25 19,25 20110930 99991231 T
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 T
J245 550,50 550,50 20120701 99991231 T
M447 139,25 139,25 20120701 99991231 T
S022 101,75 101,75 20120701 99991231 T

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. T-SQL Wtorek #106 :ZAMIAST wyzwalaczy

  2. Jak utworzyć tabelę tymczasową w SQL?

  3. Jak włączyć dzienniki ogólne i dzienniki błędów w AWS RDS?

  4. Ulepszanie naszego modelu danych internetowego portalu pracy

  5. Jak uzyskać wczorajszą datę w T-SQL