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

SCD Type 2

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, når du kører SortCL-programmet. De fleste SCD-typer bruger en fuld ydre joinforbindelse til at matche poster fra den originale datakilde med poster i opdateringskilden 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 2, hvor jeg vedligeholder produktomkostninger. Opdateringen udføres ved at slutte sig til feltet ProductCode .

Type 2 SCD

I denne model opbevares de aktuelle og historiske optegnelser i samme fil. I en aktiv database vil du sandsynligvis have en surrogatnøgle til at bruge som den primære nøgle til at linke til faktatabellerne ud over Produktkoden nøgle, som bruges til opdateringsprocessen. Fordi de aktuelle poster og de historiske poster er indeholdt i den samme fil, er det nødvendigt at have et felt, der angiver, om posten er den aktuelle post for ProductCode og vi har brug for et felt til at angive, hvornår prisen for Produktkoden er ikke længere effektiv. I dette eksempel har vi:

  • Produktkode :Dette er identifikationsnøglefeltet.
  • Omkostninger :Omkostninger, der trådte i kraft på Startdatoen for ordens skyld.
  • Startdato :dette er den dato, hvor prisen for registreringen trådte i kraft.
  • Slutdato :Dette er den dato, hvor omkostningerne i journalen er ikke længere effektiv. Hvis prisen stadig er effektiv, vil slutdatoen blive sat til 99991231. Dette er for at undgå en nulværdi i dette felt.
  • Aktuel :Y hvis prisen stadig er gældende, N hvis den ikke er det.

Startbordet har allerede 3 historierekorder. Det er dem, der har værdien N for feltet Current . Masterkilden hedder master2.dat og den indeholder nedenstående data:

Produktkode Omkostninger Startdato Slutdato Aktuel
C123 125,50 20110228 99991231 Y
F112 2365.00 20120101 99991231 Y
G101 19.25 20110930 99991231 Y
G101 21.25 20110501 20110930 N
J245 450,50 20110430 99991231 Y
J245 425.25 20101001 20110430 N
J245 385.25 20100215 20101001 N
S022 98,75 20110515 99991231 Y

Opdateringsposterne har alle den samme Startdato . Update.dat-kilden indeholder poster med følgende feltværdier:

Produktkode Omkostninger Startdato
F112 2425.00 20120701
J245 550,50 20120701
M447 101,75 20120701
S022 101,75 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 kilder, der skal bruges til at behandle opdateringen. For Type 2 er målet normalt den originale masterfil eller tabel.

Med det næste skærmbillede bestemmer du, hvordan opdateringsdataene kortlægges, og hvordan andre felt- eller kolonneværdier indstilles. update.Cost vil tilknyttes Master2.cost og opdateringen. Startdato vil tilknyttes master2.StartDate . Flagfeltet er det felt, der bruges til at bestemme posten med den aktive pris. Altså om værdierne i posten er aktive eller historiske. I dette tilfælde er Flagfeltet er feltet Aktuel . Den Flag positive værdi er værdien i Current der afgør, om omkostningerne er den aktuelle omkostning; værdien er "Y" i vores eksempel og Flag negativ værdi er "N". End Field indeholder navnet på det felt, der indeholder den værdi, der bruges til at bestemme, hvornår prisen for posten ikke længere er effektiv og Master.EndDate har den værdi. Slutværdi bruges som værdien for End Field når posten indeholder de aktuelle værdier for en Produktkode .

Det næste skærmbillede er til at definere den sammenkædning, der udføres med master- og opdateringskilderne. Du skal bemærke, at begge kilder skal bestilles med hensyn til Produktkode . Hvis de ikke er det, skal du vælge NOT_SORTED i rullemenuen for Sorteringsordremulighed under den datakilde, der skal sorteres.

Her er jobscriptet:

/INFILE=C:/IRI/CoSort95/workbench.orig/workspace/SCD/SCD2/master2.dat
  /PROCESS=DELIMITED
  /ALIAS=master2
  /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"')
  /FIELD=(COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"')
  /FIELD=(STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"')
  /FIELD=(ENDDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"')
  /FIELD=(CURRENT, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"')
/INFILE=C:/IRI/CoSort95/workbench.orig/workspace/SCD/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 master2 update WHERE MASTER2.PRODUCTCODE == UPDATE.PRODUCTCODE

/OUTFILE=master2.dat
# Include only records that are being updated
# Use the Cost and StartDate from the Update file 
  /PROCESS=DELIMITED
  /FIELD=(MASTER2.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"')
  /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"')
  /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"')
  /FIELD=(MASTER2.ENDDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"')
  /FIELD=(MASTER2.CURRENT, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"')
  /INCLUDE WHERE MASTER2.PRODUCTCODE == UPDATE.PRODUCTCODE AND MASTER2.CURRENT EQ “Y"
/OUTFILE=master2.dat
# Change any current records that are being updated to history records
# by giving the EndDate as the StartDate from the update record 
# and changing the field Current to N
  /PROCESS=DELIMITED
  /CONDITION=(MATCH, TEST=(MASTER2.PRODUCTCODE == UPDATE.PRODUCTCODE AND MASTER2.CURRENT EQ "Y"))
  /FIELD=(MASTER2.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"')
  /FIELD=(MASTER2.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"')
  /FIELD=(MASTER2.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"')
  /FIELD=(ENDDATE_NEW, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"', IF MATCH THEN UPDATE.STARTDATE ELSE MASTER2.ENDDATE)
  /FIELD=(CURRENT_NEW, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"', IF MATCH THEN "N" ELSE MASTER2.CURRENT)
  /OMIT WHERE MASTER2.PRODUCTCODE EQ ""
/OUTFILE=master2.dat
# Add new records
  /PROCESS=DELIMITED
  /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"')
  /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"')
  /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"')
  /FIELD=(ENDDATE_NEW="99991231", TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"')
  /FIELD=(CURRENT_NEW="Y", TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"')
  /INCLUDE WHERE UPDATE.PRODUCTCODE NE "" AND MASTER2.PRODUCTCODE EQ ""

Den nye masterfil vil have disse værdier:

Produktkode Omkostninger Startdato Slutdato Aktuel
C123 125,50 20110228 99991231 Y
F112 2425.00 20120701 99991231 Y
F112 2365.00 20120101 20120701 N
G101 19.25 20110930 99991231 Y
G101 21.25 20110501 20110930 N
J245 550,50 20120701 99991231 Y
J245 450,50 20110430 20120701 N
J245 425.25 20101001 20110430 N
J245 385.25 20100215 20101001 N
M447 101,75 20120701 99991231 Y
S022 101,75 20120701 99991231 Y
S022 98,75 20110515 20120701 N

  1. Langsom forespørgsel ved brug af BESTIL EFTER

  2. Sådan indstiller du tegnsættet og sorteringen af ​​en kolonne i MySQL

  3. Flere online operationer tilgængelige nu - eller snart

  4. Sådan opretter du en serverløs GraphQL API til MySQL, Postgres og Aurora