sql >> Database teknologi >  >> RDS >> Database

SCD Type 3

Dimensionsdata, der ændrer sig langsomt eller uforudsigeligt, fanges i Slowly Changing Dimensions (SCD) analyser. I et datavarehusmiljø har en dimensionstabel en primær nøgle, der unikt identificerer hver post og andre oplysninger, der er kendt som dimensionsdata.

Alle opdateringsmetoderne for de forskellige SCD-typer kan udføres ved hjælp af SortCL-programmet i IRI CoSort. I IRI Voracity er der en guide til at hjælpe med at skabe de SCD-jobscripts, der bruges ved kørsel af SortCL-programmet. De fleste variationer bruger en fuld ydre sammenføjning til at matche poster fra den originale stamdatakilde med poster i den opdaterede kilde baseret på at sidestille en nøgle fra hver. Optegnelser med kampe skal opdateres i masteren. Poster i opdateringskilden, der ikke har et match, skal tilføjes til masteren.

Her er en oversigt over, hvordan man opdaterer en dimensionsfil ved hjælp af SCD Type 3, hvor jeg vedligeholder produktomkostninger. Opdateringen udføres ved at slutte sig til feltet ProductCode .

Type 3 SCD

Med Type 3-modellen føres de aktuelle data og de historiske data i samme post. En af de vigtigste ting at beslutte er, hvor meget historie skal opbevares. Med vores eksempel vil jeg beholde en pris for tre startdatoer. Slutdato er den dato, hvor omkostningerne i posten ikke længere er effektive. Hvis omkostningerne stadig er effektive, er Slutdato1 feltet vil blive sat til 99991231. Dette er for at undgå en tom værdi i dette felt. Her er værdierne indeholdt i startmasterkilden (master3.dat):

Produktkode Pris1 Startdato1 Slutdato1 Pris2 Startdato2 Slutdato2 Pris3 Startdato3 Slutdato3
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

Opdateringsposterne har alle den samme startdato. Update.dat-kilden indeholder følgende feltværdier for posterne:

Produktkode Omkostninger Startdato
F112 2425.00 20120701
J245 550,50 20120701
M447 101,75 20120701
S022 101,75 20120701

Nedenfor er de opdaterede data. For hver post, der blev opdateret, flyttes hver pris, startdato og slutdato til højre med ét sæt. I den gamle aktuelle gruppe ændres slutdatoen til startdatoen for det nye opdaterede aktuelle sæt. Eventuelle værdier for det gamle tredje sæt kasseres.

Produktkode Pris1 Startdato1 Slutdato1 Pris2 Startdato2 Slutdato2 Pris3 Startdato3 Slutdato3
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

I IRI Workbench er der en Voracity-guide til at hjælpe med oprettelsen af ​​scripts til opdatering af dimensionsfiler og tabeller. Denne guide er placeret i rullemenuen Voracity på navigationslinjen. Først vælger du SCD-typen. Derefter vises vinduet, hvor du vælger de filer, der skal bruges til at behandle opdateringen.

I den øverste tabel på det næste skærmbillede bestemmer du, hvordan de data, der opdateres, tilknyttes masteren. I den midterste gruppering på skærmen skal du vælge de felter, der giver statusværdierne for de poster, der opdateres.

I rullemenuerne under Aktuel og Historiske feltsæt , det første sæt, du definerer, giver feltnavne for aktuelle værdier. Værdifelt er den dimensionelle værdi, der opdateres. Startfelt er det felt, der bestemmer, hvornår Værdifeltet blev aktiv og Afslut felt bestemmer, hvornår den ikke længere er gyldig. Definer derefter så mange sæt, som du har brug for, for antallet af historiske værdier, der opbevares.

Her er jobscriptet, der opdaterer masterfilen:

/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. Forespørg kun de første data fra en tabel

  2. Kan en Check-begrænsning relatere til en anden tabel?

  3. Sådan viser du tabel fremmednøgler

  4. Brug af JDeveloper med MySQL-database og Oracle-database på AWS RDS, del 2