sql >> Database >  >> RDS >> Database

SCD-type 2

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-types 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 SCD-typen gebruiken een volledige outer join om records uit de oorspronkelijke gegevensbron te matchen met records in de updatebron op basis van het gelijkstellen van een sleutel van elk. Records met overeenkomsten moeten worden bijgewerkt in de master. Records in de updatebron die geen overeenkomst hebben, moeten aan de master worden toegevoegd.

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

Type 2 SCD

In dit model worden de huidige en de historische gegevens in hetzelfde bestand bewaard. In een actieve database zou u naast de ProductCode waarschijnlijk een surrogaatsleutel hebben die u kunt gebruiken als primaire sleutel voor koppelingen naar de feitentabellen. sleutel die wordt gebruikt voor het updateproces. Omdat de huidige records en de historische records zich in hetzelfde bestand bevinden, is het noodzakelijk om een ​​veld te hebben dat aangeeft of het record het huidige record is voor de ProductCode en we hebben een veld nodig om aan te geven wanneer de kosten voor de ProductCode is niet meer effectief. In dit voorbeeld hebben we:

  • Productcode :Dit is het identificatiesleutelveld.
  • Kosten :kosten die van kracht werden op de StartDate voor de goede orde.
  • Startdatum :dit is de datum waarop de kosten voor het record van kracht zijn geworden.
  • Einddatum :Dit is de datum waarop de Kosten in het dossier is niet langer effectief. Als de Kosten nog steeds geldig zijn, wordt de Einddatum ingesteld op 99991231. Dit is om een ​​null-waarde in dit veld te voorkomen.
  • Huidige :Y als de kosten nog steeds van kracht zijn, N als dat niet het geval is.

De starttafel heeft al 3 historierecords. Dit zijn degenen die de waarde N hebben voor het veld Huidige . De masterbron heet master2.dat en bevat de onderstaande gegevens:

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

De updaterecords hebben allemaal dezelfde StartDate . De bron update.dat bevat records met de volgende veldwaarden:

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 2 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 wordt toegewezen aan de Master2.cost en de update. Startdatum wordt toegewezen aan de master2.StartDate . Het Vlagveld is het veld dat wordt gebruikt om het record met de actieve kosten te bepalen. Dat wil zeggen, of de waarden in de record actief of historisch zijn. In dit geval is het Vlagveld is het veld Huidige . De Positieve waarde markeren is de waarde in Huidige die bepaalt of de Kosten is de huidige Kosten; de waarde is "Y" in ons voorbeeld en de Negatieve waarde markeren is "N". End Field 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 de huidige waarden bevat voor een ProductCode .

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 jobscript:

/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 ""

Het nieuwe hoofdbestand heeft deze waarden:

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

  1. Hoe CDC op een reeks tabellen uit te schakelen OF op alle tabellen in een database in SQL Server uit te schakelen - SQL Server-zelfstudie

  2. Een string toewijzen aan een DB-reeks in Hibernate

  3. ASCII()-functie in Oracle

  4. ATAN2() Functie in Oracle