sql >> Database >  >> RDS >> Database

SCD-type 6

Dimensionale gegevens die langzaam of onvoorspelbaar veranderen, worden vastgelegd in Slowly Changing Dimensions (SCD)-analyses. In een datawarehouse-omgeving heeft een dimensietabel een primaire sleutel die elk record en andere stukjes informatie die bekend staan ​​als de dimensionale gegevens op unieke wijze identificeert.

Alle updatemethoden voor de verschillende SCD-typen kunnen worden uitgevoerd met behulp van het SortCL-programma in IRI CoSort. In IRI Voracity is er een wizard die helpt bij het maken van de SCD-taakscripts die worden gebruikt bij het uitvoeren van het SortCL-programma. De meeste varianten gebruiken een volledige outer join om records uit de oorspronkelijke gegevensbron te matchen met records in de bijgewerkte bron op basis van het gelijkstellen van een sleutel van elk. Records in de updatebron die geen overeenkomst hebben, moeten aan de master worden toegevoegd.

Hier is een overzicht van hoe u een dimensionaal bestand of tabel bijwerkt met SCD Type 6 waarbij ik de productkosten handhaaf. De update wordt bereikt door lid te worden van het veld ProductCode .

Type 6 SCD

Type 6 is een hybride die een combinatie is van Type 1, Type 2 en Type 3. Het wordt Type 6 genoemd omdat 1+2+3=6. Elk record heeft de volgende velden:

  • Productcode :  Dit is het identificatiesleutelveld.
  • Kosten :huidige kosten van het product.
  • Historische kosten :kosten die van kracht werden op de startdatum voor dat record.
  • Startdatum :Datum waarop de HistoricalCost van kracht werd.
  • Einddatum :Datum waarop de HistoricalCost voor het record niet langer de huidige CurrentCost was. Als de historische kosten nog steeds de huidige kosten zijn, dan is de einddatum 99991231.
  • Huidige :Y als Kosten nog steeds actueel zijn, N als dat niet het geval is

Laten we nu eens kijken naar de records voor ProductCode J245. Laten we beginnen wanneer de vroegste HistoricalCost was de huidige kosten. De HistorischeKosten zijn gelijk aan de Kosten. Er is dan één record voor de ProductCode J245 en deze heeft de onderstaande waarden:

Productcode Kosten Historische kosten Startdatum Einddatum Huidige
J245 385,25 385,25 20100215 99991231 J

Wanneer een nieuwe kostprijs moet worden geïmplementeerd, worden de waarden in het updaterecord gebruikt om een ​​nieuw huidig ​​record toe te voegen. De Huidige kosten in alle records met de productcode J245 wordt gewijzigd in de Kosten waarde uit het updaterecord terwijl de HistoricalCost blijft hetzelfde voor de bestaande records. Bovendien is de EndDate want het oude huidige record wordt gewijzigd in de StartDate voor het nieuwe huidige record. In de records met ProductCode J245, de Huidige kosten veld in het bijgewerkte hoofdbestand heeft nu de onderstaande waarden:

Productcode Kosten Historische kosten Startdatum Einddatum Huidige
J245 425,25 425,25 20101001 99991231 J
J245 425,25 385,25 20100215 20101001 N

Nu zullen we updaten met de volgende nieuwe kosten en de volgende waarden krijgen voor de J245-records:

Productcode Kosten Historische kosten Startdatum Einddatum Huidige
J245 450,50 450,50 20110430 99991231 J
J245 450,50 425,25 20101001 20110430 N
J245 450,50 385,25 20100215 20101001 N

De laatste update maakt records met deze waarden:

Productcode Kosten Historische kosten Startdatum Einddatum Huidige
J245 550,50 550,50 20120701 99991231 J
J245 550,50 450,50 20110430 20120701 N
J245 550,50 425,25 20101001 20110430 N
J245 550,50 385,25 20100215 20101001 N

Hier zijn de waarden in het hoofdbestand voorafgaand aan het bijwerken:

Productcode Kosten Historische kosten Startdatum Einddatum Huidige
C123 125,50 125,50 20110228 99991231 J
F112 2365,00 2365,00 20120101 99991231 J
G101 19.25 19.25 20110930 99991231 J
G101 19.25 21.25 20110501 20110930 N
J245 450,50 450,50 20110430 99991231 J
J245 450,50 425,25 20101001 20110430 N
J245 450,50 385,25 20100215 20101001 N
S022 98,75 98,75 20110515 99991231 J

De updategegevens hebben allemaal dezelfde StartDate . De bron update.dat bevat de volgende waarden:

Productcode Kosten Startdatum
F112 2425,00 20120701
J245 550,50 20120701
M447 101,75 20120701
S022 101,75 20120701

In IRI Workbench is er een Voracity-wizard die helpt bij het maken van scripts voor het bijwerken van dimensionale bestanden en tabellen. Deze wizard bevindt zich in de vervolgkeuzelijst Vraatzucht op de navigatiebalk. Kies eerst het SCD-type. Vervolgens wordt het venster weergegeven waarin u de bronnen selecteert die worden gebruikt voor het verwerken van de update. Voor Type 6 is het doel normaal gesproken het originele hoofdbestand of de oorspronkelijke tabel.

Met het volgende scherm bepaalt u hoe de updategegevens worden toegewezen en hoe andere veld- of kolomwaarden worden ingesteld. De update.Cost veld wordt toegewezen aan master6.CurrentCost en de update.StartDate veld wordt toegewezen aan master6.StartDate . Het Vlagveld is het veld dat wordt gebruikt om te bepalen of het record de meest recente veldwaarden bevat. In dit geval is dat veld master6.current . Als dit het meest recente record is, dan is de CurrentCost veld en de HistoryCost veld zal dezelfde waarden hebben. De Positieve waarde markeren is de waarde in master6.Current die bepaalt dat de veldwaarden de meest recente waarden zijn voor een ProductCode . Als dat het geval is, is de waarde "Y" in ons voorbeeld en de Negatieve waarde markeren is "N". Einde veld bevat de naam van het veld dat de waarde bevat die wordt gebruikt om te bepalen wanneer de kosten voor het record niet langer van kracht zijn en Master.EndDate houdt die waarde vast. Eindwaarde wordt gebruikt als de waarde voor End Field wanneer het record actueel is.

Het volgende scherm is voor het definiëren van de join die wordt uitgevoerd met de master- en updatebronnen. Houd er rekening mee dat beide bronnen moeten worden besteld met betrekking tot ProductCode . Als dat niet het geval is, moet u NOT_SORTED selecteren in de vervolgkeuzelijst voor Ordersorteeroptie onder de gegevensbron die moet worden gesorteerd.

Hier is het eerste 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

Om te beoordelen,

  • De waarde voor CurrentCost zal hetzelfde zijn voor alle records met een gemeenschappelijke ProductCode
  • Startdatum is de datum waarop de HistoricalCost effectief geworden
  • Voor het meest recente record van een ProductCode,
    • de waarden voor CurrentCost en Historische kosten zijn hetzelfde
    • de Einddatum is 99991231
    • De waarde in Huidige is Y
  • Voor de records die niet het huidige record zijn
    • Einddatum is de datum waarop de eerstvolgende recentere Kosten effectief geworden
    • Het veld Huidige heeft N voor de waarde

Het nieuwe masterbestand wordt niet gesorteerd omdat de nieuwe huidige masterrecords zijn toegevoegd aan de onderkant van het masterbestand, met waarden als deze:

Productcode Kosten Historische kosten Startdatum Einddatum Huidige
C123 125,50 125,50 20110228 99991231 J
F112 2425,00 2365,00 20120101 20120701 N
G101 19.25 19.25 20110930 99991231 J
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 J
J245 550,50 550,50 20120701 99991231 J
M447 139,25 139,25 20120701 99991231 J
S022 101,75 101,75 20120701 99991231 J

  1. MySQL:door komma's gescheiden lijst in meerdere rijen splitsen

  2. Tijdstempel bijwerken wanneer rij wordt bijgewerkt in PostgreSQL

  3. MySql Single Table, Selecteer laatste 7 dagen en voeg lege rijen toe

  4. Wat is er nieuw in SQL Server 2019?