sql >> Database >  >> RDS >> Database

SCD-type 3

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 hoofdgegevensbron te matchen met records in de bijgewerkte bron 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 3 waarbij ik de productkosten handhaaf. De update wordt bereikt door lid te worden met betrekking tot het veld ProductCode .

Type 3 SCD

Bij het Type 3 model worden de huidige data en de historische data in hetzelfde record ondergebracht. Een van de belangrijkste dingen om te beslissen is hoeveel geschiedenis moet worden bewaard. Met ons voorbeeld houd ik een kostprijs voor drie startdatums. Einddatum is de datum waarop de kosten in het record niet langer geldig zijn. Als de kosten nog steeds effectief zijn, dan is de EndDate1 veld wordt ingesteld op 99991231. Dit is om een ​​lege waarde in dit veld te voorkomen. Dit zijn de waarden in de startmasterbron (master3.dat):

Productcode Kosten1 StartDatum1 Einddatum1 Kosten2 StartDatum2 Einddatum2 Kosten3 StartDatum3 Einddatum3
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

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

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

Hieronder vindt u de bijgewerkte gegevens. Voor elk record dat is bijgewerkt, wordt elke kostprijs, startdatum en einddatum één set naar rechts verplaatst. In de oude huidige groep voor de goede orde, wordt de einddatum gewijzigd in de startdatum voor de nieuwe bijgewerkte huidige set. Alle waarden voor de oude derde set worden weggegooid.

Productcode Kosten1 StartDatum1 Einddatum1 Kosten2 StartDatum2 Einddatum2 Kosten3 StartDatum3 Einddatum3
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

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 bestanden selecteert die worden gebruikt voor het verwerken van de update.

In de bovenste tabel op het volgende scherm bepaalt u hoe de gegevens die worden bijgewerkt, worden toegewezen aan de master. Kies in de middelste groepering op het scherm de velden die de statuswaarden geven voor de records die worden bijgewerkt.

In de vervolgkeuzelijsten onder Huidige en Historische veldensets , de eerste set die u definieert, geeft de veldnamen voor huidige waarden. Waardeveld is de dimensionale waarde die wordt bijgewerkt. Veld starten is het veld dat bepaalt wanneer het Value Field werd actief en End Field bepaalt wanneer het niet meer geldig is. Definieer vervolgens zoveel sets als u nodig heeft voor het aantal historische waarden dat wordt bewaard.

Hier is het taakscript dat het hoofdbestand zal bijwerken:

/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. Wat is het Database and Relational Database Management System (RDBMS)

  2. Formatteer SQLite-resultaten als JSON

  3. Negatieve waarden opmaken met haakjes in SQL Server (T-SQL)

  4. wat is @JoinColumn en hoe wordt het gebruikt in Hibernate