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

SCD Type 6

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 varianter bruger en fuld ydre sammenføjning til at matche poster fra den originale datakilde med poster i den opdaterede kilde baseret på at sidestille en nøgle fra hver. Poster i opdateringskilden, der ikke har et match, skal tilføjes til masteren.

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

Type 6 SCD

Type 6 er en hybrid, der er en kombination af Type 1, Type 2 og Type 3. Den kaldes Type 6, fordi 1+2+3=6. Hver post vil have følgende felter:

  • Produktkode :  Dette er identifikationsnøglefeltet.
  • Omkostninger :Nuværende pris for produktet.
  • Historiske omkostninger :Omkostninger, der trådte i kraft på startdatoen for denne registrering.
  • Startdato :Dato, hvor de historiske omkostninger trådte i kraft.
  • Slutdato :Dato, hvor den historiske pris ikke længere var den aktuelle CurrentCost. Hvis den historiske pris stadig er den aktuelle pris, er slutdatoen 99991231.
  • Aktuel :Y hvis omkostninger stadig er aktuelle, N hvis det ikke er

Lad os nu bare se på posterne for Produktkode J245. Lad os starte, når de tidligste Historiske omkostninger var den nuværende Omkostning. De historiske omkostninger er de samme som omkostningerne. Der er så én post for ProductCode J245, og den har værdierne vist nedenfor:

Produktkode Omkostninger Historiske omkostninger Startdato Slutdato Aktuel
J245 385.25 385.25 20100215 99991231 Y

Når en ny omkostning skal implementeres, bruges værdierne i opdateringsposten til at tilføje en ny aktuel post. Nuværende omkostninger i alle registreringer med produktkoden J245 vil blive ændret til Omkostninger værdi fra opdateringsposten, mens Historical Cost forbliver den samme for de eksisterende poster. Derudover er Slutdato for den gamle nuværende post er ændret til Startdato til den nye nuværende rekord. I posterne med ProductCode J245, Current Cost feltet i den opdaterede masterfil har nu nedenstående værdier:

Produktkode Omkostninger Historiske omkostninger Startdato Slutdato Aktuel
J245 425.25 425.25 20101001 99991231 Y
J245 425.25 385.25 20100215 20101001 N

Nu vil vi opdatere med den næste nye pris og få følgende værdier for J245-posterne:

Produktkode Omkostninger Historiske omkostninger Startdato Slutdato Aktuel
J245 450,50 450,50 20110430 99991231 Y
J245 450,50 425.25 20101001 20110430 N
J245 450,50 385.25 20100215 20101001 N

Den endelige opdatering opretter poster, der har disse værdier:

Produktkode Omkostninger Historiske omkostninger Startdato Slutdato Aktuel
J245 550,50 550,50 20120701 99991231 Y
J245 550,50 450,50 20110430 20120701 N
J245 550,50 425.25 20101001 20110430 N
J245 550,50 385.25 20100215 20101001 N

Her er værdierne i masterfilen før opdatering:

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

Opdateringsdataene vil alle have den samme Startdato . Update.dat-kilden indeholder følgende væ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 6 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 feltet vil tilknyttes master6.CurrentCost og update.StartDate feltet vil blive knyttet til master6.StartDate . Flagfeltet er det felt, der bruges til at bestemme, om posten indeholder de seneste feltværdier. I dette tilfælde er feltet master6.current . Hvis det er den mest aktuelle post, så er CurrentCost feltet og Historikomkostninger felt vil have de samme værdier. Den Flag positive værdi er værdien i master6.Current der bestemmer, at feltværdierne er de seneste værdier for en Produktkode . Når det er tilfældet, er værdien "Y" i vores eksempel og Flag negativ værdi er "N". Afslut felt 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 er aktuel.

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 Sort Order Option under den datakilde, der skal sorteres.

Her er det første jobscript:

/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

For at gennemgå,

  • Værdien for CurrentCost vil være den samme for alle poster, der har en fælles Produktkode
  • Startdato er den dato, hvor Historiske omkostninger trådte i kraft
  • For den seneste registrering af en Produktkode,
    • værdierne for CurrentCost og Historiske omkostninger er de samme
    •  Slutdatoen er 99991231
    • Værdien i Aktuel er Y
  • For de poster, der ikke er den aktuelle post
    • Slutdato er den dato, hvor den næste nyere pris trådte i kraft
    • Feltet Aktuel har N for værdien

Den nye masterfil vil ikke blive sorteret, fordi de nye aktuelle masterposter blev tilføjet til bunden af ​​masterfilen, som vil have værdier som denne:

Produktkode Omkostninger Historiske omkostninger Startdato Slutdato Aktuel
C123 125,50 125,50 20110228 99991231 Y
F112 2425.00 2365.00 20120101 20120701 N
G101 19.25 19.25 20110930 99991231 Y
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 Y
J245 550,50 550,50 20120701 99991231 Y
M447 139,25 139,25 20120701 99991231 Y
S022 101,75 101,75 20120701 99991231 Y

  1. Brug "SELECT" til at kalde en funktion

  2. Intel Xeon skalerbare processorer og SQL Server 2017

  3. Sådan udskiftes en del af en streng i SQL

  4. Aktiver kundeforretningsintelligence via datakataloger, virksomhedsordlister og datastyring